본문 바로가기
개발/개발 공부

[프로그래머스] 코딩테스트 입문 : 개미군단

by 하모예 2024. 10. 1.

| 문제

개미군단이 사냥을 나가려고 합니다.

개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다.

장군개미는 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은 새로운 코드를 추가해줘야 합니다.

비록 간단한 문제이지만 다양한 방향의 해결법을 생각해 보면서 푸는 것이 좋습니다.

코드의 길이를 줄이고자 하는 게 아니라 더 효율적인 기능 구현을 고민하다보면 언젠가는 개미 군단 정도의 문제는 아무렇지 않게 해결하는 내 모습을 발견하게 될 거예요.

댓글