https://school.programmers.co.kr/learn/courses/30/lessons/159994
또 하나 배운 알고리즘 문제였다..
코드 먼저 보자.
class Solution {
fun solution(cards1: Array<String>, cards2: Array<String>, goal: Array<String>): String {
var answer: String = "Yes"
var index1 = 0
var index2 = 0
goal.forEach {
if(cards1.size > index1 && cards1[index1] == it){
index1++
}
else if(cards2.size > index2 && cards2[index2] == it){
index2++
}
else {
return "No"
}
}
return answer
}
}
if 문에서 &&연산자를 사용할 때도 조건의 순서가 중요하다는 점을 배웠다.
처음에는 && 연산자 사이에 조건을 별 생각없이 지금과 반대로 했었다.
if(cards1[index1] == it && cards1.size > index1)
else if(cards2[index2] == it && cards2.size > index2)
이렇게 하니 돌아오는 것은,,, 런타임 에러,,,
보아 하니 인덱스 값이 길이를 초과한 모양이다.
테스트 2번 예제와 else if 구절을 뜯어보면 이해가 가능하다.
["i", "water", "drink"] | ["want", "to"] | ["i", "want", "to", "drink", "water"] | "No" |
else if(cards2[index2] == it && cards2.size > index2){
index2++
}
테스트 2번에서는 cards2의 index2값이 0에서 "want"를 만나 1이 되고 "to"를 만나 2가 된다.
이 후 "drink"를 찾으러 가는데 cards1에서는 못찾으니 else if로 내려오게 되면서 문제가 발생한다.
&&연산자 첫 번째 조건에서 cards2[index2] == it 여기서 cards1의 인덱스는 0과 1 뿐인데 index2의 값인 2가 들어와서
배열인덱스의 범위를 초과한 값을 넣은 것이다.
&&연산자 양옆의 조건 위치를 반대로 해주니 통과가 되었다.
이를 통해 && 연산자의 첫 번째 조건을 우선적으로 검사를 한다는 것을 알 수 있었고 결과에 큰 영향을 미칠 수 있으므로 순서도 잘 생각해서 배치해주어야 한다는 걸 배웠다.
'Code KATA' 카테고리의 다른 글
Programmers 완전 탐색 모의고사 with Kotlin (1) | 2023.12.05 |
---|---|
Programmers 사과 장수 with Kotlin (1) | 2023.12.04 |
Programmers 2016년 with Kotlin (0) | 2023.11.30 |
Programmers 명예의 전당 with Kotlin (1) | 2023.11.29 |
Programmers 콜라 문제 with Kotlin (1) | 2023.11.28 |