반응형
    
    
    
  https://www.acmicpc.net/problem/28457
28457번: Every? Only One's Marble
첫 번째 줄에는 보드의 크기 $n$, 시작 시 가지는 돈 $S$, 시작점을 지나면 받게 되는 월급 $W$, 황금 열쇠 카드의 개수 $G$가 주어진다. ($3\leq n\leq 10$, $1\leq G\leq 4n-8$, $1\leq S,W\leq 10^7$) 그다음 $G$개의
www.acmicpc.net
부루마블 게임을 구현하는 문제다.
그래도 플레이어가 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 |