| 문제
개미군단이 사냥을 나가려고 합니다.
개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다.
장군개미는 5의 공격력을, 병정개미는 3의 공격력을, 일개미는 1의 공격력을 가지고 있습니다.
예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만,
장군개미 4마리와 병정개미 1마리를 데려간다면 더 적은 병력으로 사냥할 수 있습니다.
사냥감의 체력 hp가 매개변수로 주어질 때,
사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return 하도록 solution함수를 완성해 주세요.
| 제한 사항
- hp는 자연수입니다.
- 0 ≤ hp ≤ 1000
| 입출력 예
hp | result |
23 | 5 |
24 | 6 |
999 | 201 |
| 힌트
코딩테스트에 익숙하지 않은 분들이 헷갈릴만한 요소를 많이 포함하고 있는 문제입니다.
예를 들어 "사냥감의 체력에 딱 맞게 최소한의 병력을 구성"과 같은 표현이 있지요.
딱 맞게 최소한의 데이터를 사용해라니 엄청난 알고리즘처럼 보이지만, 사실 단순 계산 문제입니다.
개미 군단을 현실의 문제로 가져오면 쉽게 이해할 수 있습니다.
만일 여러분이 800원을 지불해야 하는데 500원, 100원이 있다면
100원짜리 8개를 낼 수도 있지만 500원 1개, 100원 3개를 낼 수도 있지요.
자, 이제 한번 풀어볼까요?
| 풀이 1
장군개미, 병정개미, 일개미 순으로 몇 마리가 사냥에 참여할 수 있는지 확인합니다.
장군개미를 기준으로 살펴보겠습니다.
장군개미는의 공격로 5로 나눴을 때 몫이 참여 가능한 장군개미의 수이고
참여한 장군개미들의 공격력만큼을 제외하고 병정개미의 참여 수를 따져야 하므로
최초 공격력에 5를 나눠줍니다.
public class Solution{
public int solution(int hp) {
int a = hp / 5;
hp = hp % 5;
int b = hp / 3;
int c = hp % 3;
return a + b + c;
}
}
| 풀이 2
풀이 1을 잘 살펴보면 동일한 과정이 반복하는 모습을 확인할 수 있습니다.
특정 과정이 반복할 때는 반복문을 사용할 수 있지요.
3종류의 개미의 공격력을 담고 있는 배열을 구성한 다음
해당 배열을 기준으로 반복문을 통해 동일한 로직을 수행했습니다.
public class Solution {
public int solution02(int hp) {
int answer = 0;
int[] powers = {5,3,1};
for(int power : powers) {
answer += hp/power;
hp = hp % power;
}
return answer;
}
}
| 해설
두 방법의 실질적인 코드 구성은 똑같지만 여러 방면에서 풀이 2가 풀이 1보다 좋은 코드입니다.
우선 소요시간이 많게는 50%에서 40% 정도 적게 소요되었습니다.
그리고, 확장 가능성을 고려했습니다.
만일 공격력 4를 가진 새로운 종류의 개미가 나타난다면 풀이 2는 배열에 5와 3 사이에 4라는 값만 넣어주면 되지만 풀이 1은 새로운 코드를 추가해줘야 합니다.
비록 간단한 문제이지만 다양한 방향의 해결법을 생각해 보면서 푸는 것이 좋습니다.
코드의 길이를 줄이고자 하는 게 아니라 더 효율적인 기능 구현을 고민하다보면 언젠가는 개미 군단 정도의 문제는 아무렇지 않게 해결하는 내 모습을 발견하게 될 거예요.
'개발 > 개발 공부' 카테고리의 다른 글
[프로그래머스] 코딩테스트 입문 : 가위 바위 보 (0) | 2024.10.03 |
---|---|
[프로그래머스] 코딩테스트 입문 : 모스부호(1) (8) | 2024.10.02 |
[프로그래머스] 코딩테스트 입문 : 순서쌍의 개수 (2) | 2024.09.30 |
[프로그래머스] 코딩테스트 입문 : 진료순서 정하기 (2) | 2024.09.20 |
[프로그래머스] 코딩테스트 입문 : 외계행성의 나이 (2) | 2024.09.19 |
댓글