코딩테스트/PYTHON

[프로그래머스][PYTHON] Lv. 1 카드 뭉치

_알파카 2024. 7. 31. 02:40
728x90

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/159994

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

주어진 카드 뭉치들을 사용하여 원하는 단어 배열을 만들 수 있는지 확인하는 문제이다. 

 

내 풀이

def solution(cards1, cards2, goal):
    # c1과 c2는 각 카드뭉치에서 goal에 몇 번 사용했는지 나타냄
    c1, c2 = 0, 0
    for i in goal:
        # 만들고자 하는 문장에서의 단어가 어떤 카드 뭉치에 있는지 판단
        if i in cards1:
            # goal 문장에 사용된 횟수와 인덱스가 맞지 않으면 원하는 단어 배열을 만들지 못함
            if c1 != cards1.index(i):
                # 더 이상 진행하지 않고 바로 No return
                return "No"
            c1 += 1
        else:
            if c2 != cards2.index(i):
                return "No"
            c2 += 1
        
    return "Yes"

 

먼저, c1과 c2는 각각 첫 번째와 두 번째 카드 뭉치에서 사용된 단어의 인덱스를 나타낸다. 

goal 리스트의 단어를 순회하며, 현재 단어가 cards1 혹은 cards2에 있는지 확인한다. 

이때, c1 혹은 c2와 각 카드 뭉치에서의 인덱스가 일치하는지 확인하고, 

일치하면 c1을 하나 증가시키며, 

일치하지 않다면, 목표 단어 배열을 만들 수 없으므로 No를 반환한다. 

 

다른 사람 풀이

def solution(cards1, cards2, goal):
    for g in goal:
        if len(cards1) > 0 and g == cards1[0]:
            cards1.pop(0)       
        elif len(cards2) >0 and g == 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를 리턴하게 된다. 

 

 

 

from collections import deque

def solution(cards1, cards2, goal):
    # 카드 뭉치를 큐로 변환
    queue1 = deque(cards1)
    queue2 = deque(cards2)
    
    for word in goal:
        if queue1 and queue1[0] == word:  # queue1의 첫 번째 단어가 현재 단어와 일치하는 경우
            queue1.popleft()  # queue1에서 단어를 제거
        elif queue2 and queue2[0] == word:  # queue2의 첫 번째 단어가 현재 단어와 일치하는 경우
            queue2.popleft()  # queue2에서 단어를 제거
        else:  # 현재 단어가 어느 큐의 첫 번째 단어와도 일치하지 않는 경우
            return "No"
    
    return "Yes"

 

큐(queue)를 사용하는 방법도 있다. 

 

728x90