[파이썬 코딩테스트] 카드 뭉치

ch.2·2024년 8월 22일
0

코딩 테스트

목록 보기
20/21
post-thumbnail

문제

프로그래머스 연습 문제 Lv.1

코니는 영어 단어가 적힌 카드 뭉치 두 개를 선물로 받았습니다. 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶습니다.

  • 원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
  • 한 번 사용한 카드는 다시 사용할 수 없습니다.
  • 카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
  • 기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.

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

문제 예시
예를 들어 첫 번째 카드 뭉치에 순서대로 ["i", "drink", "water"], 두 번째 카드 뭉치에 순서대로 ["want", "to"]가 적혀있을 때 ["i", "want", "to", "drink", "water"] 순서의 단어 배열을 만들려고 한다면 첫 번째 카드 뭉치에서 "i"를 사용한 후 두 번째 카드 뭉치에서 "want"와 "to"를 사용하고 첫 번째 카드뭉치에 "drink"와 "water"를 차례대로 사용하면 원하는 순서의 단어 배열을 만들 수 있습니다.


최종 시도 전까지 문제를 잘못 이해하고 있었다.
cards1 과 cards2 중 원하는 카드 뭉치 하나를 선택해 카드 한 장씩 번갈아 꺼내는 문제라고 이해했고, 두 번째 시도까지 이러한 논리 형태로 코드를 이어나갔다.🥲


첫 번째 시도

def solution(cards1, cards2, goal):
    answer = ''
    result = []
    for indx1, c1 in enumerate(cards1):
        for indx2, c2 in enumerate(cards2):
            goal[i]
  • 문제의 조건대로 만든 배열을 담기 위한 리스트 result를 빈 리스트로 정의했다.
  • 카드 뭉치에서 각 카드를 순서대로 빼내야 하기 때문에 인덱스 사용을 고려해 enumerate를 사용해 for 문을 구성했다.

result 안에 문제의 조건을 어떻게 담을지 고민을 길게 하고 있을 때, 멘토링 시간이 되어 튜터님에게 여쭤보았다.

  • 반복문 두 개가 합쳐져 있으면 곱하기로 반복 횟수가 정해진다.
    그런데 지금은 goal 리스트의 길이만큼 반복해야 한다. goal의 길이는 곧 cards1와 cards2의 길이를 더한 것이므로 두 리스트의 길이를 더한 것만큼 반복하도록 할 것!

  • 리스트의 가장 앞 요소를 불러오면서 삭제하는 방법은 .pop()의 인수에 0 을 집어넣는 것!
    .pop(0)

  • cards1과 cards2의 길이가 서로 같지 않을 가능성도 있다. 이때는 특정 리스트가 비어있으면 비어있지 않은 리스트를 사용하도록 할 것!


두 번째 시도

def solution(cards1, cards2, goal):
    result= []
    for i in range(len(cards1 + cards2)):
        if cards1 != []:
            result.append(cards1.pop(0))
        if cards2 != []:
            result.append(cards2.pop(0))
    if result == goal:
        return 'Yes'
    else:
        return 'No'
  • for 문의 반복 횟수를 수정했다.
  • if 와 elif를 통해 각 카드 뭉치가 비어있지 않을 때, 각 카드 뭉치의 가장 앞 요소를 뽑아 result에 추가하도록 작성했다.
  • 반복을 마친 후 result와 goal을 비교해 알맞은 문구를 출력하도록 마무리했다.

코드를 실행하고 테스트 케이스 결과를 보니, 'Yes'가 나와야 할 케이스에서도 'No'가 출력된 것을 확인할 수 있었다.
result를 확인하기 위해 else 문에서 'No'와 result를 함께 출력하도록 했다.

테스트 케이스 결과


먼저 테스트 1의 실행 결과를 보니 문법은 조금 이상하지만 내가 의도한 대로 잘 작성되었다는 것을 확인할 수 있었다.
하지만 입력값을 자세히 보니, cards2의 요소들이 한번에 사용되어야만 goal이 된다는 것을 알 수 있었다.
이후 문제와 문제 예시를 다시 읽고, 문제에서 요구하는 조건은 카드 뭉치 두 개를 번갈아 한 장씩 사용하는 것이 아니라는 것을 깨달았다.
원하는 카드 뭉치 하나에서만! 한 장씩 사용하는 것이 문제의 조건이었다. 🥲


📌 최종 정답 코드

def solution(cards1, cards2, goal):
    result = []
    for i in goal:
        if cards1 != [] and i == cards1[0]:
            result.append(cards1.pop(0))
        elif cards2 != [] and i == cards2[0]:
            result.append(cards2.pop(0))
    if result == goal:
        return 'Yes'
    else:
        return 'No'
  • 문제를 다시 분석해보니 goal에 먼저 접근하는 게 더 편한 방법일 수도 있겠다는 생각을 했다.
  • for 문에서 goal의 요소 하나씩을 반복하도록 작성했다.

1. 카드 뭉치가 빈 리스트가 아닐 때
2. goal의 요소 i와 각 카드 뭉치의 첫 번째 요소가 동일할 때

  • 두 조건을 모두 만족하면 각 카드 뭉치의 첫 번째 요소를 뽑아 result 변수에 추가하도록 작성했다.

  • 이후 각 카드 뭉치의 요소를 모두 추가한 result와 goal이 동일한지 확인하고 각각 'Yes'와 'No'를 출력하도록 했다.

profile
데이터 분석 공부중

0개의 댓글