[프로그래머스] 햄버거 만들기

neoneoneo·2024년 3월 22일
0

kotlin

목록 보기
42/49
post-custom-banner

문제

햄버거 만들기

요약 | 햄버거는 [1, 2, 3, 1] 순서대로 1개를 만들 수 있다(1-빵, 2-야채, 3-고기). 제시되는 재료 배열에서 햄버거를 최대 몇 개까지 만들 수 있지 구하여라.

코드

class Solution {
    fun solution(ingredient: IntArray): Int {
        var answer: Int = 0 
        var items = ingredient.toMutableList() //1
        var pattern = listOf(1, 2, 3, 1) //2
        var i = 0
        while (i <= items.size - 4) { //3, 4
            if (i >= 0) { //5
                if (items.subList(i, i + 4) == pattern) { //6
                    answer++ //6
                    items.subList(i, i + 4).clear() //7
                    i -= 5 //8
                }
            }
            i++ //9
        }        
        return answer
    }
}

풀이 과정

  1. ingredient를 바로 가공할 수 없으므로 mutableList로 변환
  2. 순서에 대한 리스트 변수(pattern) 선언
  3. 재료 리스트(items)를 순회
  4. 재료 리스트의 길이에서 pattern의 길이를 제외한 횟수 만큼 반복*
  5. i가 0 이상일 때에만 조건 수행**
  6. 재료 리스트의 일부가 pattern과 일치하면 answer에 1씩 적립
  7. 재료 리스트에서 pattern에 해당하는 일부 리스트를 제거
  8. pattern의 다음 요소부터 검사하기 위해 i에서 pattern 길이 + 1 만큼을 빼기(1을 빼는 이유는, if문 밖에서 1을 더할 것이기 때문)
  9. i에 1을 더하여 다음 인덱스 검사
  • 1~9 과정 반복

*햄버거를 1개 포장하게 되면, items에서 햄버거 1개 만큼의 길이가 줄어들게 되며, while의 순회 조건에서는 줄어든 items의 길이를 계산하여 반복 횟수를 정하게 됨

**햄버거를 포장했을 때, 다음에 검사할 인덱스(i)가 음수가 되는 경우가 있으므로 if (i >= 0)로 필터링을 해야함

역대급 의문 사건

통과는 하였지만 코드를 조금 더 수정해서 연산 횟수를 줄여보려고 했다.

첫 번째 코드:
햄버거 하나를 포장한 후, i -= 5를 하면 i가 음수가 되어서 if(i > 0) 문에 걸리게 된다.
그러면 i++를 음수가 아닐 때까지 반복해서 처리하게 된다.

i가 0이 될 때까지 불필요하게 반복해주지 말고, 햄버거 하나를 포장하면 i를 0으로 만들어주자는 생각이 들었다.

그래서 두 번째 코드:

class Solution {
    fun solution(ingredient: IntArray): Int {
        var answer: Int = 0
        var items = ingredient.toMutableList()
        var pattern = listOf(1, 2, 3, 1)       
        var i = 0
        while (i <= items.size - 4) {
            if (i >= 0) {
                if (items.subList(i, i + 4) == pattern) {
                    answer++
                    items.subList(i, i + 4).clear()
                    i = -1  // 이 부분을 수정
                }
            }
            i++
        }        
        return answer
    }
}

햄버거 하나를 포장하면 i를 -1로 만들고,
if 문을 빠져나가면 i++ 되어 i = 0 으로 만들어서 처리를 한다.

테스트 케이스는 통과하지만, 실제로 채점을 해보면

오히려 시간초과 오류가 난다.

나는 불필요한 연산 시간을 줄여준다고 생각했는데, 오히려 i에 대한 코드를 한 줄 바꿨더니 시간초과 오류가 나왔다. 어딘가에서 무한반복에 빠져있는 걸까..? 도저히 의문이 풀리지 않아 질문하기에 글을 올려두었다...

올린 질문 보러가기


[TIL-240322]

post-custom-banner

0개의 댓글