본문 바로가기
🐣 알고리즘

[백준] Swift - 24467번: 혼자하는 윷놀이

by @Eddy 2024. 6. 13.
728x90
👆문제풀러 가기👆

문제

오전 4시, 민재는 윷놀이를 하고 싶어졌다. 하지만 다들 자는 시간이라 윷놀이를 같이 할 사람은 없었다.

민재는 윷놀이를 혼자 할 수 있는 방법을 생각해냈다.

혼자 하는 윷놀이에 적용되는 규칙은 다음과 같다.

  • 처음에 말은 윷판의 오른쪽 아래에 위치한다.
  • 열 번의 차례 안에 말 하나가 완주하면 민재가 승리한다.
  • 차례 한 번에는 윷가락 네 개를 던진 후:
    • 뒷면이 하나인 경우 말을 한 칸 전진시킨다.
    • 뒷면이 둘인 경우 말을 두 칸 전진시킨다.
    • 뒷면이 셋인 경우 말을 세 칸 전진시킨다.
    • 모두 뒷면인 경우 말을 네 칸 전진시킨 뒤, 윷을 추가로 던진다.
    • 모두 앞면인 경우 말을 다섯 칸 전진시킨 뒤, 윷을 추가로 던진다.
  • 윷판을 정해진 경로로 한 바퀴를 돌아 윷판의 오른쪽 아래에 도착한 뒤 한 칸 더 움직여야  완주할 수 있다.
  • 혼자 하나의 말로 하는 게임이므로 상대 말을 잡거나 자신의 말을 업는 경우는 없다.
  • 일반적인 윷놀이의 낙과 뒷도 등의 룰은 고려하지 않는다.

게임이 진행될 윷놀이판은 다음과 같다.

 

윷판에서 말이 갈 수 있는 길은 그림과 같이 네 가지이다.

 

빈 원으로 표시된 위치에 말이 놓이면 상대적으로 짧은 길로 가야한다. 그 위치에 놓이지 않는다면 상대적으로 먼 길로 가야 한다.

민재의 승리 여부를 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄부터 민재가 윷가락을 어떻게 던졌는지 순서대로 주어진다.

각 줄에는 0과 1로 이루어진 길이가 4인 문자열이 주어진다. 0은 윷가락 뒷면, 1은 윷가락 앞면을 나타낸다.

민재는 완주하더라도 10턴을 모두 진행할 때까지 윷을 계속 던진다. 단, 50줄을 초과하는 입력은 주어지지 않는다.

마지막 입력은 도, 개, 걸 중 하나로 주어진다.

 

 

출력

민재가 혼자 하는 윷놀이에서 이겼다면 WIN, 졌다면 LOSE를 출력한다.


 

풀이

// MARK: - 혼자하는 윷놀이
func solution() -> String {
    var chance = 10 // 던질 수 있는 기회
    var move = 0
    var visitedPoint = 0 // 꼭지점 방문 여부
    var visitedCenter = false
    var result = "LOSE"

    while chance > 0 { // 모든 기회를 소진할 때까지 던지기
        chance -= 1

        let throwing = readLine()!.compactMap { Int(String($0)) }
        let count = throwing.filter{$0 == 0}.count
        guard let yut = Yut(rawValue: count) else { continue }
        let jump = yut.jump

        if yut == .모 || yut == .윷 { // 모, 윷이면 1번 더!
            chance += 1
        }

        move += jump

        if visitedPoint == 0 && move % 5 == 0 && move < 15 { // 꼭지점에 처음 도착하면
            visitedPoint = move                              // 방문 위치 저장
        }

        if visitedPoint == 5 {  // 첫번째 꼭지점에 방문했었으면
            if visitedCenter {  // 중앙 방문했으면
                if move >= 12 { // 12이상이면 승리
                    result = "WIN"
                }
            } else {  // 아직 중앙에 방문하지 않았는데
                if move == 8 {  // 이제 방문했으면
                    visitedCenter = true // 방문확인
                    continue
                }

                if move >= 17 {  // 중앙에 방문하지 않았지만, 17칸 넘어가면 승리
                    result = "WIN"
                }
            }
        }

        if visitedPoint == 10 { // 2번째 꼭지점에 방문했었으면
            if move >= 17 {     // 17이상이면 승리
                result = "WIN"
            }
        }
    }

    if move > 20 { result = "WIN" } // 20칸 넘게 이동했으면 승리

    return result
}

enum Yut: Int {
    case 도 = 1 // 뒷면(0)의 갯수
    case 개 = 2
    case 걸 = 3
    case 윷 = 4
    case 모 = 0

    var jump: Int {
        switch self {
        case .도:
            return 1
        case .개:
            return 2
        case .걸:
            return 3
        case .윷:
            return 4
        case .모:
            return 5
        }
    }
}

 

모든 경우의 수를 제거하는 깡 구현 문제

반응형

댓글