개미 군단
개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.
- hp는 자연수입니다.
- 0 ≤ hp ≤ 1000
function solution(hp) {
let answer = 0;
if(hp >= 5) {
answer += Math.floor(hp / 5);
hp -= Math.floor(hp / 5) * 5;
}
if(hp >= 3) {
answer += Math.floor(hp / 3);
hp -= Math.floor(hp / 3) * 3;
}
if (hp >= 1) {
answer += Math.floor(hp / 1);
hp -= Math.floor(hp / 1) *1;
}
return answer;
}
// 다른 사람의 풀이
function solution(hp) {
let cnt = 0;
let arr = [5, 3, 1];
let i = 0;
while(i <arr.length) {
let item = arr[i];
if(hp >= item) {
cnt += Math.floor(hp / item);
hp -= Math.floor(hp / item) * item;
}
i++;
}
return cnt;
}
function solution(hp) {
let cnt = 0;
[5,3,1].forEach(v => {
cnt += Math.floor(hp/v);
hp = hp % v;
})
return cnt;
}
<다른 사람의 풀이에 대한 이해>
공격력은 정해진 값이므로, 배열에 넣어서 풀어보고 싶었으나 떠오르지 않았다.
forEach()
모스부호 (1)
머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
모스부호는 다음과 같습니다.
morse = {
'.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
'--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
'--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
'...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
'-.--':'y','--..':'z'
}
- 1 ≤ letter의 길이 ≤ 1,000
- return값은 소문자입니다.
- letter의 모스부호는 공백으로 나누어져 있습니다.
- letter에 공백은 연속으로 두 개 이상 존재하지 않습니다.
- 해독할 수 없는 편지는 주어지지 않습니다.
- 편지의 시작과 끝에는 공백이 없습니다.
const morse = {
'.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
'--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
'--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
'...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
'-.--':'y','--..':'z'
}
function solution(letter) {
let currentMorse = '';
let answer = '';
for(let i = 0; i < letter.length; i++) {
const item = letter[i];
if(item === ' ') {
answer += morse[currentMorse];
currentMorse = '';
} else {
currentMorse += item;
}
}
answer += morse[currentMorse];
return answer;
}
// 다른 사람의 풀이
function solution(letter) {
let answer = '';
const splittedLetter = letter.split(' ');
let i =;
while(i < splittedLetter.length) {
answer += morse[splittedLetter[i];
}
return answer;
}
return letter.split(' ').map(v=>morse[v]).join('');
function solution(letter) {
return letter.split(' ').reduce((prev, curr) => prev + morse[curr], '')
}
<다른 사람의 풀이에 대한 이해>
split(' ')
map()
join()
reduce() : map() + join() ??
가위 바위 보
가위는 2 바위는 0 보는 5로 표현합니다. 가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때, rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 return하도록 solution 함수를 완성해보세요.
- 0 < rsp의 길이 ≤ 100
- rsp와 길이가 같은 문자열을 return 합니다.
- rsp는 숫자 0, 2, 5로 이루어져 있습니다.
function solution(rsp) {
let answer = '';
let i = 0;
while(i < rsp.length) {
const item = rsp[i];
if(item === "2") {
answer += "0";
}
if(item === "0") {
answer += "5";
}
if(item === "5") {
answer += "2";
}
i++;
}
return answer;
}
// 다른 사람의 풀이
const win = {
"2": "0",
"0": "5",
"5": "2",
}
function solution(rsp) {
let answer = '';
let i = 0;
while(i < rsp.length) {
const item = rsp[i];
answer += win[item];
i++;
}
return answer;
}
function solution(rsp) {
let arr = {
2: 0,
0: 5,
5: 2
};
var answer = [...rsp].map(v => arr[v]).join("");
return answer;
}
<다른 사람의 풀이에 대한 이해>
각각 대응하는 요소들이 있으면 키와 값의 쌍으로 만들어, 객체를 사용하면 된다.
map()
join()
구슬을 나누는 경우의 수
머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.
- 1 ≤ balls ≤ 30
- 1 ≤ share ≤ 30
- 구슬을 고르는 순서는 고려하지 않습니다.
- share ≤ balls
// 서로 다른 n개 중 m개를 뽑는 경우의 수
// => nCm = n! / (n-m)! * m!
// n! = n * (n-1) * ... * 1
function solution(balls, share) {
let answer = 0;
const n = balls;
const r = share;
let one = 1;
let i = n;
while(i >= n-r+1) {
one *= i;
i--;
}
let three = 1;
let j = r;
while(j >= 1) {
three *= j;
j--;
}
answer = Math.floor(one / three);
return answer;
}
// 다른 사람의 풀이
const 팩토리얼 = (num) => num === 0 ? 1 : num * 팩토리얼(num - 1)
function solution(balls, share) {
return Math.round(팩토리얼(balls) / 팩토리얼(balls - share) / 팩토리얼(share))
}
function solution(balls, share) {
return (
Array.from({ length: share }, (_, i) => balls - i).reduce((a, b) => a * b) /
Array.from({ length: share }, (_, i) => share - i).reduce((a, b) => a * b)
);
}
단순히 팩토리얼만으로 계산하게 되면, 오버플로우 현상이 나타나서 해결할 수 없게 된다.
따라서, nCr => nPr+1 / r! 로 계산해야 한다.
<다른 사람의 풀이에 대한 이해>
Math.round()를 사용하면 부동소수점 문제를 해결할 수 있다.
Array.from()
참고 영상
https://youtu.be/qmcGPpZ5kJ4?si=UH7zxPZ4loElkMCY
부동소수점 문제에 대한 글
'코딩테스트 > 프로그래머스 0단계 - 입문' 카테고리의 다른 글
프로그래머스 0단계 - Day11 수학, 반복문 (0) | 2024.03.19 |
---|---|
프로그래머스 0단계 - Day10 조건문, 배열, 수학, 시뮬레이션 (0) | 2024.03.18 |
프로그래머스 0단계 - Day8 배열, 구현, 수학 (0) | 2024.03.17 |
프로그래머스 0단계 - Day7 문자열, 조건문, 수학, 반복문 (0) | 2024.03.17 |
프로그래머스 0단계 - Day6 문자열, 반복문, 출력, 배열, 조건문 (0) | 2024.03.16 |
댓글