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

YoungHyun Kim·2023년 11월 22일
1

매일매일 알고리즘

목록 보기
5/30

문제

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

원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
한 번 사용한 카드는 다시 사용할 수 없습니다.
카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.
예를 들어 첫 번째 카드 뭉치에 순서대로 ["i", "drink", "water"], 두 번째 카드 뭉치에 순서대로 ["want", "to"]가 적혀있을 때 ["i", "want", "to", "drink", "water"] 순서의 단어 배열을 만들려고 한다면 첫 번째 카드 뭉치에서 "i"를 사용한 후 두 번째 카드 뭉치에서 "want""to"를 사용하고 첫 번째 카드뭉치에 "drink""water"를 차례대로 사용하면 원하는 순서의 단어 배열을 만들 수 있습니다.

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


풀이

  • card1, card2 두 카드 뭉치의 앞에 있는 단어를 꺼내서 변수에 저장하기.
  • 목표로 하는 문장의 맨 앞 단어(A)와, 두 카드 뭉치에서 꺼낸 단어(B)가 일치하면 A와 B 단어를 삭제하고 새로운 단어를 꺼내서 비교하기.
  • 계속 반복하다가, goal 배열의 모든 문자를 비교하는 데 성공하면 "Yes" 실패하면 "No" 를 반환하기.

위의 세 단계를 진행할 수 있도록 코드를 짜봤는데, 이는 아래와 같이 작성했다.

import Foundation

func solution(_ cards1:[String], _ cards2:[String], _ goal:[String]) -> String {
    var deck1 = cards1, deck2 = cards2, isPossible = false
    var temp1 = deck1.removeFirst(), temp2 = deck2.removeFirst()
    for x in goal {
        if x == temp1 {
            temp1 = deck1.isEmpty ? "" : deck1.removeFirst()
            if x == goal[goal.count - 1] { isPossible = true }
            continue
        } 
        else if x == temp2 {
            temp2 = deck2.isEmpty ? "" : deck2.removeFirst()
            if x == goal[goal.count - 1] { isPossible = true }
            continue
        }
        else { break } // 카드 뭉치에서 꺼낸 순서대로 비교할 수 없을 때, 즉 문장을 완성할 수 없을 때 for 문 밖으로 나가기
    }
    if isPossible { return "Yes" } else { return "No" }
}

문장을 완성할 수 있는지 판별하는 Bool 변수를 하나 생성하고, 이것에 따라서 적절한 결과값을 반환할 수 있도록 코드를 작성했다.


회고

  1. 코드를 작성하면서 직접 Bool 변수를 활용한 적은 처음이다. 조건문에 변수 그대로를 넣어서 참 거짓을 판별할 수 있는 점이 매우 간편하고 좋아서, 가능/불가능 여부를 따지는 알고리즘에는 적절하게 사용할 수 있겠다는 생각이 들었다.
  2. Array.isEmpty 메소드는 해당 배열이 현재 가지고 있는 요소가 없다면 true를 반환하는 메소드이다. 이 문제에서는 "카드 뭉치"라는 문제 제목에 걸맞게 배열에서 문자 하나 씩을 추출해서 비교하도록 코드를 작성했기 때문에 isEmpty 메소드를 잘 활용한 것 같다!
profile
iOS 개발자가 되고 싶어요

0개의 댓글