PS/Implementation

백준 24467번: 혼자 하는 윷놀이 (JAVA)

닻과매 2022. 2. 15. 20:02

문제

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

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

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

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

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

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

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

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

입력

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

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

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

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

 

출력

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

 

 


 

풀이

말의 상태 status를 3개로 분류할 수 있다:

1) 한바퀴를 쌩으로 다 도는 상태

2) ↙ 대각선을 타고 가는 상태

3) ↘ 대각선을 타고 가능 상태

그리고 현재 위치를 space에 저장한다. 상태가 1일 때는 space가 21이여야지 나가는 것이며, 상태가 2, 3일 때는 16일 때 나가는 것이다.

 

그리고 상태가 바뀌는 말의 위치는 3군데가 있다:

1) 처음에서부터 5칸('모' 나오면 가는 자리): 상태가 1에서 2로 바뀐다.

2) 처음에서부터 10칸: 상태가 1에서 3으로 바뀐다.

3) 가운데 칸: 상태가 2에서 3으로 바뀌며, space가 5칸 더해진다(앞으로 5칸 간 효과).

 

이를 코드로 구현한다. 혼자한다고 해도 여러 말이 가는 경우, 업는 경우, 모 나오면 한 번 더 했다가 모아서 갈 때의 최적값 등 여러 가지 상황이 있을 수도 있는데 이 문제는 간단하다.

 

 

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
	static int status = 1;
	static int space = 0;
	static int[] yutToMove = {4, 3, 2, 1, 5};
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String yut;
		while ((yut = br.readLine()) != null) {
			int frontNum = 0;
			for (int i = 0; i < yut.length(); i++) {
				if (yut.charAt(i) == '1') frontNum++;
			}
			yutMove(frontNum);
		}
		if ((status == 1 & space >= 21) || (status >= 2 && space >= 17)) System.out.println("WIN");
		else System.out.println("LOSE");
	}
	
	
	static void yutMove(int frontNum) {
		space += yutToMove[frontNum];
		if (status == 1 && space == 5) {
			status = 2;
		}
		if (status == 1 && space == 10) {
			status = 3;
		}
		if (status == 2 && space == 8) {
			status = 3;
			space = 13;
		}
	}

}

 

여담

코드 좀 깔끔하게 짠 거 같다... 자랑하려고 올림ㅎㅎ

'PS > Implementation' 카테고리의 다른 글

한별포스  (0) 2022.04.01
백준 17825번: 주사위 윷놀이  (0) 2022.03.30
백준 10158번: 개미 (JAVA)  (2) 2022.02.10
백준 2527번: 직사각형 (JAVA) TODO  (0) 2022.02.09
백준 2477: 참외밭 (JAVA) TODO  (0) 2022.02.09