CS/알고리즘_문제풀이(파이썬)

알파윷 - D

Jedy_Kim 2021. 8. 11. 12:26
728x90

문제

윷놀이 판에 말 4개가 움직일때, 얻은 점수 합을 출력하라. 각 말들이 가장 마지막에 밟았던 칸의 점수를 합산한다.

말의 이동 시작점은 Start 이며, 도착지점은 End 이다. 만약, 이동해야하는 칸이 도착 지점을 넘어서거나, 도착 지점을 밟았을 경우 도착 지점의 점수를 얻고 해당 말은 판에서 제외된다. 제외된 말은 더 이상 이동할 수 없다. 예를 들어, 50점과 75점 칸을 밟을 경우, 화살표가 가리키는 방향으로 움직여야한다. 기본적으로 흰색 칸이 있는 경로로 이동한다.

이동하려고 하는 칸에 다른 말이 있는 경우 이동할 수 없다. 해당 입력은 "-1"을 출력하도록 한다.

 

입력

첫 번째 줄에 총 이동 횟수 N이 주어진다. 두 번째 줄에 이동하게되는 칸의 수가 공백을 통해 구분하여 N개 주어진다. 세 번째 줄에 주어진 칸의 수를 몇 번 말이 이동하게 되는지 공백을 통해 구분하여 주어진다. (1 ≤ N ≤ 10, 1 ≤ 이동하는 칸의 수 ≤ 5, 1 ≤ 말의 번호 ≤ 4)

 

출력

각 말들이 이동을 종료한 후 위치해있는 칸의 점수 합을 출력한다. 만약 이동하려고 하는 칸에 다른 말이 있는 경우 "-1" 을 출력한다.

 

입력 예제 1

5

2 3 1 2 4

1 1 2 3 4

출력 예제 1

85

입력 예제 2

8

5 5 5 5 3 2 3 2

1 2 3 4 1 2 3 4

출력 예제 2

-1

 

#코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from collections import defaultdict
import sys
 
 
if __name__ == "__main__":
  input = sys.stdin.readline
  
  main_board     = [0510152050303540451005560657075808590955001000275250300150175150125350400]
  sub_board_idx  = [
    [52223242526],
    [222324252615],
    [232425261516],
    [242930202121],
    [252615161718],
    [261516171819],
    [102728242930],
    [272824293020],
    [282429302021],
    [293020212121],
    [302021212121]
  ]
  
  moving = [[-1* 6 for _ in range(35)]
  for i in range(11):
    for j in range(16):
      moving[sub_board_idx[i][0]][j] = sub_board_idx[i][j]
  
  N            = int(input())
  move         = list(map(int, input().split()))
  player       = list(map(int, input().split()))
  player_cnt   = defaultdict(int)
  isPossible   = True
  
  for p in player:
    player_cnt[p] = 0
    
  
  for m, p in zip(move, player):
    for i in range(11):
      flag = False
      if player_cnt[p] == sub_board_idx[i][0]:
        flag = True
        break
    
    if flag:
      player_cnt[p] = moving[player_cnt[p]][m]
    else:
      player_cnt[p] += m
      if player_cnt[p] >= 21: player_cnt[p] = 21
    
    temp_dic = defaultdict(int)
    for k, v in player_cnt.items():
      if v > 0:
        temp_dic[v] += 1 
      if temp_dic[v] > 1:
        isPossible = False 
        break
    
    if player_cnt[p] == 21: break  
     
  if isPossible:
    sum_val = 0
    for k, v in player_cnt.items():
      sum_val += main_board[v]
    print(sum_val)
  else:
    print(-1
cs

 

반응형

'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글

세 소수의 합  (0) 2021.08.13
알파윷 - E  (1) 2021.08.11
퇴사  (0) 2021.08.10
알파윷 - C  (0) 2021.08.09
알파윷 - B  (0) 2021.08.09