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
}
}
}
모든 경우의 수를 제거하는 깡 구현 문제
반응형
'🐣 알고리즘' 카테고리의 다른 글
[백준] Swift - 21610번: 마법사 상어와 비바라기 (0) | 2024.07.04 |
---|---|
[프로그래머스] Swift - 가장 긴 팰린드롬 (LV.3) (1) | 2024.06.18 |
[프로그래머스] Swift - 단속카메라 (LV.3) (0) | 2024.06.08 |
[프로그래머스] Swift - 날짜 비교하기 (LV.0) (0) | 2024.06.06 |
[프로그래머스] Swift - 구명보트 (LV.2) (0) | 2024.06.06 |
댓글