처음 시도한 코드
def solution(cards1, cards2, goal):
g1 = []
g2 = []
for i in goal:
if i in cards1:
g1.append(i)
if i in cards2:
g2.append(i)
if g1 == cards1 and g2 == cards2:
return 'Yes'
elif g1 == cards1 and len(g2) == 0:
return 'Yes'
elif len(g1) == 0 and g2 == cards2:
return 'Yes'
else:
return 'No'
goal의 요소를 순차적으로 cards1과 cards2와 비교하여 cards1에 존재하면 g1에 cards2에 존재하면 g2에 분리하였다.
순서대로 나눴으므로 g1과 cards1이 같고, g2와 cards2가 같으면 Yes를 리턴하였다.
문제에서 cards1과 cards2를 모두 사용해야 한다는 말이 없으므로, goal의 단어가 모두 cards1과 같거나 cards2와 같은 경우에도 Yes를 리턴하였다.
하지만 위 코드를 정답으로 제출하면 세 개의 케이스에서 통과하지 못하였다.
그 이유가 무엇일지 생각해 보니 하나의 카드 뭉치만 사용하더라도 cards1에 있는 단어를 모두 사용해야 한다는 조건은 없었다.
cards1, cards2의 단어를 사용해서 순서대로 문장을 만들되 모든 단어를 사용할 필요는 없는 것이다.
정답 코드
def solution(cards1, cards2, goal):
for i in goal:
if cards1 and i == cards1[0]:
cards1.pop(0)
elif cards2 and i == cards2[0]:
cards2.pop(0)
else:
return 'No'
return 'Yes'
기존 코드로는 해결이 어려울 것 같아 다른 방향으로 코드를 작성해 보았다.
goal의 모든 요소들을 순차적으로 돌며 해당 요소가 cards1 또는 cards2의 0번째 요소와 같은 지 비교하는 것이다.
문제에서 주어진 예시를 가지고 살펴보면 다음과 같다.
cards1 = ["i", "drink", "water"], cards2 = ["want", "to"], goal = ["i", "want", "to", "drink", "water"]이면
goal의 요소를 for문으로 하나씩 불러온다.
'i'가 cards1의 0번째 요소와 같으므로 cards1의 0번째 요소인 'i'를 지우고 다음 요소를 비교한다. → cards1 = ["drink", "water"], cards2 = ["want", "to"]
'want'는 cards2의 0번째 요소와 같으므로 cards2의 0번째 요소인 'want'를 지우고 다음 요소를 비교한다. → cards1 = ["drink", "water"], cards2 = ["to"]
'to'는 cards2의 0번째 요소와 같으므로 cards2의 0번째 요소인 'to'를 지우고 다음 요소를 비교한다. → cards1 = ["drink", "water"], cards2 = []
'drink'는 cards1의 0번째 요소와 같으므로 cards1의 0번째 요소인 'drink'를 지우고 다음 요소를 비교한다. → cards1 = ["water"], cards2 = []
'water'는 cards1의 0번째 요소와 같으므로 cards1의 0번째 요소인 'water'를 지우고 반복문을 마친다. → cards1 = [], cards2 = []
for문을 문제없이 마무리하면 Yes를 리턴한다.
하지만, 중간에 cards1 또는 cards2의 0번째 요소와 다르다면 순서대로 만들어진 문장이 아니므로 No를 리턴한다.
정답 코드에서 if문에 cards1 또는 cards2를 왜 쓰는지 의문을 가질 수 있다.
if cards1 and i == cards1[0]:
cards1.pop(0)
elif cards2 and i == cards2[0]:
cards2.pop(0)
cards1[0] 또는 cards2[0]에 접근하려면 cards1 또는 cards2가 빈 리스트가 아닌 상태여야 한다.
단순히 if i == cards1[0]만 작성하면 cards1에 요소가 하나도 없을 때 IndexError가 발생하게 된다.
그렇기 때문에 리스트에 값이 존재하는 경우에 True가 되므로 그때 [0]번 인덱스와 비교하는 것이다.