본문으로 바로가기

[백준 17825] 주사위 윷놀이 - JAVA

category 알고리즘 2021. 1. 26. 15:12

주사위 윷놀이

시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초512 MB68052586150134.160%

문제

주사위 윷놀이는 다음과 같은 게임판에서 하는 게임이다.

img

  • 처음에는 시작 칸에 말 4개가 있다.
  • 말은 게임판에 그려진 화살표의 방향대로만 이동할 수 있다. 말이 파란색 칸에서 이동을 시작하면 파란색 화살표를 타야 하고, 이동하는 도중이거나 파란색이 아닌 칸에서 이동을 시작하면 빨간색 화살표를 타야 한다. 말이 도착 칸으로 이동하면 주사위에 나온 수와 관계 없이 이동을 마친다.
  • 게임은 10개의 턴으로 이루어진다. 매 턴마다 1부터 5까지 한 면에 하나씩 적혀있는 5면체 주사위를 굴리고, 도착 칸에 있지 않은 말을 하나 골라 주사위에 나온 수만큼 이동시킨다.
  • 말이 이동을 마치는 칸에 다른 말이 있으면 그 말은 고를 수 없다. 단, 이동을 마치는 칸이 도착 칸이면 고를 수 있다.
  • 말이 이동을 마칠 때마다 칸에 적혀있는 수가 점수에 추가된다.

주사위에서 나올 수 10개를 미리 알고 있을 때, 얻을 수 있는 점수의 최댓값을 구해보자.

입력

첫째 줄에 주사위에서 나올 수 10개가 순서대로 주어진다.

출력

얻을 수 있는 점수의 최댓값을 출력한다.

예제 입력 1 복사

예제 출력 1 복사

예제 입력 2 복사

예제 출력 2 복사

예제 입력 3 복사

예제 출력 3 복사

예제 입력 4 복사

예제 출력 4 복사

 

 

풀이

19년도 삼성전자 코딩테스트 기출문제.

 

문제를 보고 추가적인 제한조건을 생각해야 하는게 까다로운 문제였습니다.

 

이 문제의 핵심인 빨간색으로 이동하는 경우와 파란색으로 이동하는 경우가 처리해줘야할 핵심 로직입니다.

 

img

이렇게 윷놀이 판이 있을 경우 파란색 원으로 되어있는

10, 20, 30 이 써져있는 원의 경우 두가지 길이 있습니다.

 

파란색 길과 (13) 빨간색 길(12)가 있습니다.

만약 주사위를 던진 수가 딱 파란색 원에 도착한다면 이어서 주사위를 던질때 파란색 길로 가야하는건 문제를 보신 분이라면 다 알 것입니다.

 

위의 그림에서 동그라미 안에 있는 숫자는 인덱스가아닌 값 입니다.

그러면 위의 그림을 인덱스로 다시 표현하면 아래와 같습니다

(제가 임의로 붙인 인덱스이며 꼭 이렇게 안해도 됩니다)

 

img

 

 

이제 위의 그림을 이용해서 연결관계를 만들어 봅시다.

 

 

위 윷놀이 판의 동그라미 원은 총 31칸이네요

31칸의 Node타입의 배열을 만들어주면 됩니다.

 

red_next는 빨간색 길로 갔을 때의 다음 원의 "인덱스" 입니다.

blue_next는 파란색 길로 갔을 때의 다음 원의 "인덱스" 입니다.

now_num은 현재 인덱스 원안에 있는 값 입니다. 원본 그림에 써져있는 2,4,6,8,10 등 써져있는 값입니다.

 

그리고 연결관계를 인덱스를 붙힌 그림과 원본 그림에 있는 값을 하나하나 적어주면 됩니다.

blue_next가 없는 경우는 0으로 값을 뒀습니다.

 

 

그 다음 4개의 말은 현재 인덱스의 위치와 boolean 변수 flag를 두었는데요

 

flag가 true이면 파란색으로 칠해진 것으로 가는겁니다.

문제에서 5번째 인덱스 , 10번째 인덱스, 15번째 인덱스의 경우 파란색으로 빠질수 있으니 주사위를 굴려 최종적으로 도착한 위치가

5, 10, 15인덱스에 도착한다면 flag = true로 둡니다.

 

아래 로직에서 flag가 true이면 Node클래스의 blue_next로 이동하면 됩니다.

 

 

그 다음 4개의 말을 이동할 것을 정해줘야 하는데, 이는 순열로 정할수 있습니다

주사위의 횟수만큼 순열을 통해 값을 만들어줍니다

주사위를 4번 돌려서 1111이 나오면 1번말을 4번 주사위 던지는 것인데

순열을 구하면

1111 ~ 4444의 모든 경우의 수가 나오기 때문에 가능합니다.

 

 

그리고 문제의 조건중에서 중복된 말에 대한 부분이 있는데

중복된 칸에 도착을 한다면 아예 갈 수 없다고 처리를 하고 해줘야 합니다.

 

 

전체코드