연습장

10. 카드 뭉치 본문

프로그래머스/1단계

10. 카드 뭉치

js0616 2023. 12. 15. 15:56

 

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