1) cards1과 cards2 요소들의 인덱스 값을 각각 리스트에 저장한다(goal의 있는 요소들과의 순서비교를 위해).
2) goal에 들어있는 요소들의 순서를 체크하기 위하여 goal에 있는 요소들이 card1과 card2에서 몇번 인덱스에 있었는지 저장한다.
3) 1)에서 저장한 인덱스 값들과 2)에서 저장한 인덱스 값이 다를 경우 result에 False를 넣어주고, 같은 경우 True를 넣어준다.
4) result에 False가 하나라도 있는 경우에는 순서가 달라 goal을 만들 수 없는 경우이기 때문에 "No"를 반환한다.
def solution(cards1, cards2, goal):
result = []
card1_idx = []
card2_idx = []
for a in cards1:
card1_idx.append(cards1.index(a))
for b in cards2:
card2_idx.append(cards2.index(b))
goal_idx_1 = []
goal_idx_2 = []
for i in goal:
if i in cards1:
goal_idx_1.append(cards1.index(i))
elif i in cards2:
goal_idx_2.append(cards2.index(i))
if card1_idx == goal_idx_1:
result.append(True)
else:
result.append(False)
if card2_idx == goal_idx_2:
result.append(True)
else:
result.append(False)
# print(result)
if False in result:
return 'No'
else:
return 'Yes'
이렇게 작성했을 경우에는 테스트케이스 20,21,24를 통과하지 못한다..
위의 코드의 경우 카드 뭉치에서 카드를 순서대로 사용하지 않는 경우를 고려하지 않아 통과가 안된 거 같다.
예를 들면, 아래 테스트 케이스와 같은 경우를 고려하지 않은 것이다.
["a", "b", "c"], ["d", "e", "f"], ["a", "d", "f"]
"No"
해당 테스트케이스의 경우 cards2에서 d다음 e가 나와야하는데 건너뛰고 f가 되어야 하는 상황이라 결과가 No가 되는데, 내가 처음으로 작성한 코드에서는 이러한 경우를 고려하지 않았다.
1) cards1과 cards2 요소 중 goal에 해당 요소들이 있다면 그 인덱스 값을 저장해준다(cards1과 cards2의 요소가 goal에 다 쓰이는게 아니기때문에 해당 조건 넣어봄).
2) goal에 들어있는 요소들의 순서를 체크하기 위하여 goal에 있는 요소들이 card1과 card2에서 몇번 인덱스에 있었는지 저장해준다.
3) 1)에서 저장한 인덱스 값들과 2)에서 저장한 인덱스 값이 다를 경우 result에 False를 넣어주고, 같은 경우 True를 넣어준다.
4) result에 False가 하나라도 있는 경우에는 순서가 달라서 goal을 만들 수 없는 경우이기 때문에 "No"를 반환한다.
def solution(cards1, cards2, goal):
result = []
card1_idx = []
card2_idx = []
# cards1과 cards2에 들어있는 값의 인덱스 값 저장
for a in cards1:
if a in goal: # 조건 추가
card1_idx.append(cards1.index(a))
for b in cards2:
if b in goal: # 조건 추가
card2_idx.append(cards2.index(b))
goal_idx_1 = []
goal_idx_2 = []
# goal에 있는 요소들이 card1과 card2에서 몇번 인덱스에 있었는지 저장
for i in goal:
if i in cards1:
goal_idx_1.append(cards1.index(i))
elif i in cards2:
goal_idx_2.append(cards2.index(i))
if card1_idx == goal_idx_1:
result.append(True)
else:
result.append(False)
if card2_idx == goal_idx_2:
result.append(True)
else:
result.append(False)
if False in result:
return 'No'
else:
return 'Yes'
하지만 이렇게 수정하여도.....
테스트 케이스 25번을 통과할 수가 없었다🤬
그리고 1번 과정이 정확히 어떤 영향을 주고 있는지도 완전히 이해하지 못한채 테스트 20,21,24번이 정답처리 되고 갑자기 25번이 오답처리 되었다...😢
아무리 수정해도 25번을 통과하기 어려워서 다른 분들이 작성한 답을 참고하였다.
def solution(cards1, cards2, goal):
a = cards1.pop(0) # cards1 리스트의 0번 인덱스 값을 리턴하고 삭제
b = cards2.pop(0) # cards2 리스트의 0번 인덱스 값을 리턴하고 삭제
while goal:
c = goal.pop(0) # goal 리스트의 0번 인덱스 값을 리턴하고 삭제
# cards1의 0번 인덱스 값과 goal의 0번 인덱스 값이 같고
# cards1이 빈 리스트가 아니라면 cards1의 0번 인덱스 값 제거
if (a == c) :
if (len(cards1) > 0) :
a = cards1.pop(0)
# cards2의 0번 인덱스 값과 goal의 0번 인덱스 값이 같고
# cards2이 빈 리스트가 아니라면 cards2의 0번 인덱스 값 제거
elif (b == c) :
if (len(cards2) > 0) :
b = cards2.pop(0)
else:
return 'No'
return 'Yes'
위 코드는 다른 분들이 작정한 코드 중 내가 이해하기 가장 쉬웠던 코드이다.
goal의 0번째 인덱스의 값을 빼주고, 해당 값이 cards1나 cards2의 0번째 인덱스와 같은데 cards1과 cards2가 비어있지 않다면 해당 값을 cards1이나 cards2에서 빼준다.
이 방법을 사용하면 내가 첫 시도에서 고려하지 못했던 카드 뭉치에서 카드를 순서대로 사용하지 않는 경우가 해결된다.
이 코드가 100% 이해된게 아니기 때문에 복습이 필요할 거 같다.