새소식

⌨️ Algorithms/프로그래머스

[Python] 프로그래머스 Lv1_카드 뭉치

2023. 4. 9. 22:42

  • -

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

 

프로그래머스

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

programmers.co.kr

 

  • 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶음
    • 원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용
    • 한 번 사용한 카드는 다시 사용할 수 없음
    • 카드를 사용하지 않고 다음 카드로 넘어갈 수 없음
    • 기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없음
  • 예를 들어 첫 번째 카드 뭉치에 순서대로 ["i", "drink", "water"], 두 번째 카드 뭉치에 순서대로 ["want", "to"]가 적혀있을 때 ["i", "want", "to", "drink", "water"] 순서의 단어 배열을 만들려고 한다면
    • 첫 번째 카드 뭉치에서 "i"를 사용한 후
    • 두 번째 카드 뭉치에서 "want"와 "to"를 사용하고
    • 첫 번째 카드뭉치에 "drink"와 "water"를 차례대로 사용하면 원하는 순서의 단어 배열을 만들 수 있음
  • 문자열로 이루어진 배열 cards1, cards2와 원하는 단어 배열 goal이 매개변수로 주어질 때, cards1과 cards2에 적힌 단어들로 goal를 만들 있다면 "Yes"를, 만들 수 없다면 "No"를 return

제한사항

  • 1 ≤ cards1의 길이, cards2의 길이 ≤ 10
    • 1 ≤ cards1[i]의 길이, cards2[i]의 길이 ≤ 10
    • cards1과 cards2에는 서로 다른 단어만 존재
  • 2 ≤ goal의 길이 ≤ cards1의 길이 + cards2의 길이
    • 1 ≤ goal[i]의 길이 ≤ 10
    • goal의 원소는 cards1과 cards2의 원소들로만 이루어져 있음
  • cards1, cards2, goal의 문자열들은 모두 알파벳 소문자로만 이루어져 있음

 

"""
입출력 예시)

cards1 = ["i", "drink", "water"], cards2 = ["want", "to"], goal = ["i", "want", "to", "drink", "water"] -> "Yes"
cards1 = ["i", "water", "drink"], cards2 = ["want", "to"], goal = ["i", "want", "to", "drink", "water"] -> "No"
"""

 

 

## 의사코드 ##

# 카드 뭉치에서 순서대로 한 장씩 사용 -> 큐 이용 (선입선출)
#  from collections import deque

# for w in goal:
   # cards1이 비어있지 않고 현재 단어가 cards1의 첫 번째 원소와 같다면 cards1의 첫 번째 원소 삭제
#  if cards1 and w == cards1[0]:
#     cards1.popleft()
   # cards2가 비어있지 않고 현재 단어가 cards2의 첫 번째 원소와 같다면 cards2의 첫 번째 원소 삭제
#  elif cards2 and w == cards2[0]:
#     cards2.popleft()
# else:
#   return 'No'

 

 

 

 

from collections import deque

def solution(cards1, cards2, goal):
    cards1 = deque(cards1)
    cards2 = deque(cards2)
    for w in goal:
        if cards1 and w == cards1[0]:
            cards1.popleft()
        elif cards2 and w == cards2[0]:
            cards2.popleft()
        else:
            return 'NO'
    return 'Yes'

 

 

  • 카드 뭉치에서 순서대로 한 장씩 사용 
    • 선입선출 이용 (deque)
  • deque인 cards1 과 cards2가 비어있지 않은 경우에만 카드를 사용할 수 있으므로 'cards1', 'cards2' 라는 조건 추가
    • index error 방지

 

 

  • 과정 확인
cards1 = ["i", "water", "drink"]
cards2 = ["want", "to"]
goal = ["i", "want", "to", "drink", "water"]

"""
cards1: deque(['i', 'water', 'drink'])
cards2: deque(['want', 'to']) 

w: i
cards1: deque(['water', 'drink']) 

w: want
cards2: deque(['to']) 

w: to
cards2: deque([]) 

w: drink

'NO'
"""

 

 

 

 

 

 

https://velog.io/@ggb05224/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%B9%B4%EB%93%9C-%EB%AD%89%EC%B9%98-python

 

프로그래머스 - 카드 뭉치 (python)

문자열로 이루어진 배열 cards1, cards2 와 원하는 단어 배열 goal 이 매개변수로 주어질 때, cards1과 cards2에 적힌 단어들로 goal를 만들 수 있다면 'Yes'를, 만들 수 없다면 'No'를 return하는 solution 함수를

velog.io

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!