코틀린/코딩테스트

코딩테스트 [개미 군단]

정혜현 2024. 6. 13. 10:05

문제

개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.

 

https://school.programmers.co.kr/learn/courses/30/lessons/120837


 

풀이

1. 접근

1.1 관찰

머쓱이와 하하호호하며 지내왔는데 갑자기 지문도 길고 내용도 길어졌다. 이제 문제를 보고 직관적으로 풀 시절은 간건가.... 분석해보자.

장군개미 = 5

병정개미 = 3

일개미 = 1

 

기능 : hp를 5로 나눈다. 몫을 answer에 담는다. 나머지가 0인지 확인한다. 0이 아니면 나머지를 3으로 나눈다. 몫을 answer에 추가한다. 나머지가 0인지 확인한다. 0이 아니면 나머지를 answer에 추가한다.

반환 : 나머지가 0일 때 answer를 반환한다.

 

 

 

 

2. 시행착오

2.1 시도

  • 가설 : if문
    hp를 5로 나눈 나머지가 0인지 확인하여 0이면 5로 나눈 몫을 answer에 담는다. 아니면 5로 나눈 몫과 3으로 나눈 몫을 answer에 담는다. 그것도 아니면 5로 나눈 몫과 3으로 나눈 몫과 3으로 나눈 나머지를 answer에 담는다. 
class Solution {
    fun solution(hp: Int): Int {
        var answer: Int = 0
        if(hp%5==0){answer=hp/5}
            else if(hp%5!=0){
            answer = hp/5+hp/3}
            else{answer = hp/5+hp/3+hp%3}
        return answer
    }
}
  • 검증 : 실패

에러는 아니고 값이 틀렸다. 5로 나눈 hp에 추가연산이 들어가야하는데 각각 연산해서 더하고 있고 else는 else if 조건에 해당돼서 실행되지 못한다. 추가연산하는 방법은 떠오르지 않아 다른 방법을 찾아보기로 했다. 나머지에 초점을 두고 나머지가 5일 때 몫을 담아 반환, 3이나 1일 때 5의 몫에 1을 추가해서 반환, 4이거나 2일 때 5의 몫에 2를 추가해서 반환했다. 

class Solution {
    fun solution(hp: Int): Int {
        var answer: Int = 0
        if(hp%5==0){answer = hp/5}
            else if(hp%5==3|| hp%5==1){answer= hp/5+1}
                else if(hp%5==4 || hp%5==2){answer= hp/5+2}
            return answer
    }
}
  • 검증 : 성공

코드가 지저분해 when문으로 정리했다. 

class Solution {
    fun solution(hp: Int): Int {
        var answer: Int = 0
        if(hp % 5 == 0) answer = hp / 5
            else when (hp % 5) {
                4,2-> answer = hp / 5 + 2
                3,1-> answer = hp / 5 + 1
            }
        return answer
    }
}

 

2024. 06. 17

그러면 원래 계획했던대로 추가연산하는 방법을 알아보자. 

class Solution {
    fun solution(hp: Int): Int {
        var answer: Int = 0
        if(hp % 5 == 0) answer = hp / 5
            else if (hp % 5 == 3) { 
            answer += hp / 5
            answer += (hp % 5) / 3
            }
                else { 
                answer += hp / 5
                answer += (hp % 5) / 3
                answer += (hp % 5) % 3
                }
        return answer
    }
}

 

어차피 모든 값을 다 더해주는거라 굳이 조건문을 쓸 필요가 없었다. 마지막 표현식끼리 더해 한줄로 만들어본다.

class Solution {
    fun solution(hp: Int): Int {
        var answer: Int = 0
        answer = hp / 5 + (hp % 5) / 3 + (hp % 5) % 3
        return answer
    }
}

 

최대한 줄여본다.

 

 

 

최후의 최선 : 

 

class Solution {
    fun solution(hp: Int): Int  = hp / 5 + (hp % 5) / 3 + (hp % 5) % 3
}

회고

많이 헤맸던 문제. 문제 설명이 길어진만큼 난이도가 올라갔다고 느껴져 겁부터 먹었다. 굳이 조건문으로 쓸 필요가 없는데 https://hhyun-s2.tistory.com/61 이 문제와 함께 너무 어렵게 생각해서 사서 고생했다.

수학적 사고력을 배제하고 단순하게 접근할 수 있는 방법은 뭐가 있을까? 역시 출력될 값을 생각해 보는 게 제일 도움되겠다. 이 문제는 모든 값을 더하고 있다. '굳이?'라는 자문도 해보면 도움 될 것 같다. 다음에 적용해보자. 

'방법은 많구나.'를 느꼈지만 최소의 시간과 최소의 비용으로 문제를 해결할 수 있는 게 중요하다.