연습장
10. 카드 뭉치 본문
goal 에 있는 원소인덱스로 번호를 매긴다면
예제1.
cards1 = [0,3,4]
cards2 = [1,2]
예제2.
cards1 = [0,4,3]
cards2 = [1,2]
예제 2의 cards 의 순서가 0 -> 4 -> 3 으로 진행되므로 No 가 된다.
1. goal 의 원소를 빼서 각 cards 를 숫자(goal 의 인덱스)로 바꾼 후
2. cards 의 숫자가 오름차순으로 진행되는지 확인한다
1의 경우 list.index('해당문자') 로 확인 할 수 있다.
def solution(cards1, cards2, goal):
answer = ''
for word1 in cards1:
print(goal.index(word1))
return answer
다음과 같이 card1 의 원소가 goal 의 몇번째에 있는지 확인 가능하다.
따라서 이 값이 테스트2 처럼 작아진다면 No 가 되게 된다.
def solution(cards1, cards2, goal):
card1_num = -1
card2_num = -1
for word1 in cards1:
if card1_num < goal.index(word1):
card1_num = goal.index(word1)
else :
return "No"
for word2 in cards2:
if card2_num < goal.index(word2):
card2_num = goal.index(word2)
else :
return "No"
return "Yes"
그리고 제출하면 다음과 같이 런타임 에러가 뜬다.
시간 초과가 아닌 런타임 에러의 경우 로직상 예외 케이스가 있다는 거고
제한 사항을 확인 해본 결과
goal 의 길이보다 cards1 + cards2 의 길이가 더 길수도 있다.
-> cards 의 모든 단어를 다 써서 만드는게 아니라는 것이다.
간단하게 예시를 적어보면 다음과 같이 5와 14가 남더라도 goal 은 만들 수 있게 된다.
따라서 goal 에 해당 단어가 있는지 확인하는 구문이 필요하다.
def solution(cards1, cards2, goal):
card1_num = -1
card2_num = -1
for word1 in cards1:
if word1 in goal:
if card1_num < goal.index(word1):
card1_num = goal.index(word1)
else :
return "No"
for word2 in cards2:
if word2 in goal:
if card2_num < goal.index(word2):
card2_num = goal.index(word2)
else :
return "No"
return "Yes"
런타임 에러는 해결되었는데 마지막 25번 테스트 케이스가 오류가 났다.
에러는 나지 않는다는거고 예외 케이스가 있다는 뜻으로 해석된다.
다음과 같은 조건이 있었다.
만약 다음과 같은 case 의 경우
3 5 14 가 없지만 3을 건너뛴 4를 갈 수 없으므로 No 가 나와야 하는데 내 코드의 경우 Yes 가 나오게 된다.
-->
문제를 잘못이해하고 진행한거 같아서 다시 풀어보겠다.
이번엔 goal 의 원소를 하나씩 빼와서
각 card 의 현재 원소랑 비교해서 일치하면
그 card 는 다음 원소로 넘어가는 방식으로 해야될꺼같다.
def solution(cards1, cards2, goal):
card1_idx = 0
card2_idx = 0
for word in goal:
if word == cards1[card1_idx]:
card1_idx +=1
elif word == cards2[card2_idx]:
card2_idx +=1
else:
return "No"
return "Yes"
간단하게 생각하면 다음과 같이 진행 할 수 있는데
각 cards 의 마지막 단어까지 확인하면 그 단어보다 +1 한 인덱스의 단어와 비교하게 되기 때문에
index 의 범위를 벗어나는 오류가 발생한다.
여러가지 해결 방법중에서
더이상 진행이 되지 않도록 절대 일치하지 않는 단어를 하나 넣어서 index오류가 발생하지 않도록 하겠다.
제한 사항에 다음과 같이 소문자만 사용한다고 되어있으므로 대문자를 각 card 뭉치에 넣어서 해결하였다.
def solution(cards1, cards2, goal):
# 현재 카드의 위치
card1_idx = 0
card2_idx = 0
# 맨 마지막 인덱스 오류 해결용
cards1.append("A")
cards2.append("A")
# 카드 규칙 로직
for word in goal:
if word == cards1[card1_idx]:
card1_idx +=1
elif word == cards2[card2_idx]:
card2_idx +=1
else:
return "No"
return "Yes"
'프로그래머스 > 1단계' 카테고리의 다른 글
12. 덧칠하기 (0) | 2023.12.16 |
---|---|
11. 소수 찾기 (1) | 2023.12.15 |
9. 완주하지 못한 선수 (0) | 2023.12.14 |
8. 문자열 나누기 (0) | 2023.12.12 |
7. 체육복 (0) | 2023.12.12 |