반응형
https://www.acmicpc.net/problem/28457
부루마블 게임을 구현하는 문제다.
그래도 플레이어가 1명이라 구현 난이도가 엄청 높진 않다.
(플레이어가 여러명인 Yut Nori 같은 문제 구현에 비하면..)
구현할 때 다음과 같은 2가지 사항에 주의해야했다.
1. 보드의 사이즈가 작을 때는 주사위 한번으로 2바퀴를 돌 수도 있다.
=> 월급을 w 만큼 주지 말고, 이동 후 pos를 보드사이즈로 나눈 몫을 w에 곱해서 월급을 주도록 한다.
2. 골드 카드로 이동하는 경우, 이동 후에 즉시 행동을 해야한다.
나는 처음에 행동을 구현할 때 각 행동이 끝나면 continue 를 해서 다음 주사위 입력을 받도록 했었는데,
이걸 골드 카드의 이동 후 행동 부분에 그대로 적용했더니,
continue 때문에 gold 카드의 인덱스를 올리지 않는 문제가 발생해서 틀렸었다.
클래스를 이용해서 코드를 짰다면 좀 더 깔끔했을 것 같다.
n, s, w, g = map(int, input().split())
gold_cards = []
for _ in range(g):
a, b = map(int, input().split())
gold_cards.append((a, b))
board = ['s']
for i in range(4*n-8):
if i == n-2:
board.append('m')
elif i == 2*n-4:
board.append('f')
elif i == 3*n-6:
board.append('t')
info = input().split()
if info[0] == 'G':
board.append('g')
else:
board.append(int(info[1]))
gold_cards_idx = 0
pos = 0
money = s
muindo_count = 0
fund = 0
I = int(input())
for _ in range(I):
a, b = map(int , input().split())
if muindo_count > 0: # 무인도에 갇혀있을 때
if a == b:
muindo_count = 0 # 탈출 후 주사위 한번더 굴리기
continue
else:
muindo_count -= 1
continue
pos += (a+b)
if pos >= len(board):
money += w*(pos//len(board)) # 월급 지급
pos %= len(board)
if board[pos] == 'm': # 무인도 방문
muindo_count = 3
elif board[pos] == 'f': # 사회복지기금 방문
money += fund
fund = 0
elif board[pos] == 't':
pos = 0
money += w
elif board[pos] == 'g':
cmd, x = gold_cards[gold_cards_idx]
if cmd == 1:
money += x
elif cmd == 2:
money -= x
if money < 0:
print('LOSE')
exit(0)
elif cmd == 3:
money -= x
fund += x
if money < 0:
print("LOSE")
exit(0)
elif cmd == 4:
pos += x
if pos >= len(board): # 조건상 이걸로 한바퀴 이상 못 돈다.
money += w*(pos//len(board)) # 월급 지급
pos %= len(board)
if board[pos] == 'm': # 무인도 방문
muindo_count = 3
elif board[pos] == 'f': # 사회복지기금 방문
money += fund
fund = 0
elif board[pos] == 't':
pos = 0
money += w
elif board[pos] == 's':
pass
else:
if money >= board[pos]:
money -= board[pos]
board[pos] = 0
gold_cards_idx += 1
gold_cards_idx %= g
elif board[pos] == 's':
pass # 월급 처리는 이동 하면서 이미 했음
else:
if money >= board[pos]:
money -= board[pos]
board[pos] = 0
left = sum([board[i] for i in range(4*n-4) if isinstance(board[i], int)])
if left == 0:
print("WIN")
else:
print("LOSE")
반응형
'알고리즘 (PS) > BOJ' 카테고리의 다른 글
[백준] 9370 - 미확인 도착지 (G2) (0) | 2023.10.02 |
---|---|
[백준] 28458 - Mahjong Tenpai (P5) (0) | 2023.08.27 |
[백준] 3015 - 오아시스 재결합 (P5) (0) | 2023.07.04 |
[백준] 17299 - 오등큰수 (G3) (0) | 2023.07.04 |
[백준] 2485 - 가로수 (S4) (0) | 2023.07.04 |