요약 | 햄버거는 [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 } }
- ingredient를 바로 가공할 수 없으므로 mutableList로 변환
- 순서에 대한 리스트 변수(pattern) 선언
- 재료 리스트(items)를 순회
- 재료 리스트의 길이에서 pattern의 길이를 제외한 횟수 만큼 반복*
- i가 0 이상일 때에만 조건 수행**
- 재료 리스트의 일부가 pattern과 일치하면 answer에 1씩 적립
- 재료 리스트에서 pattern에 해당하는 일부 리스트를 제거
- pattern의 다음 요소부터 검사하기 위해 i에서 pattern 길이 + 1 만큼을 빼기(1을 빼는 이유는, if문 밖에서 1을 더할 것이기 때문)
- 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]