[프로그래머스][PYTHON] Lv. 1 카드 뭉치
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/159994
주어진 카드 뭉치들을 사용하여 원하는 단어 배열을 만들 수 있는지 확인하는 문제이다.
내 풀이
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)를 사용하는 방법도 있다.