[백준 삼성기출 X] 새로운 게임 2(python)

이진규·2022년 9월 25일
1

백준(PYTHON)

목록 보기
101/115

문제

https://www.acmicpc.net/problem/17837

나의 코드

"""

"""

from sys import stdin
input = stdin.readline

n, k = map(int, input().split()) # n : 체스판의 크기, k : 말의 개수
pan = [ list(map(int, input().split())) for _ in range(n) ] # 체스판 - 0 : 흰색, 1 : 빨간색, 2 : 파란색
chess = [ [[] for _ in range(n)] for _ in range(n) ]

dx, dy = [0, 0, -1, 1], [1, -1, 0, 0]
horse = []

for i in range(k):
    r, c, d = map(int, input().split())
    horse.append([r-1, c-1, d-1])
    chess[r-1][c-1].append(i)

turn = 0

def solve(horse_num):
    x, y, dir = horse[horse_num]
    mx = x + dx[dir]
    my = y + dy[dir]

    if not (0 <= mx < n and 0 <= my < n) or pan[mx][my] == 2:
        if dir in (0, 2):
            dir += 1
        else:
            dir -= 1
        horse[horse_num][2] = dir
        mx = x + dx[dir]
        my = y + dy[dir]
        if not (0 <= mx < n and 0 <= my < n) or pan[mx][my] == 2:
            return True # 방향을 돌렸는데도 범위를 벗어나거나 다시 파란색을 만났으면 이번 horse_num의 말은 차례가 끝났다는 말로 True를 return

    horse_add = [] # 옮길 말의 정보를 담는 리스트
    for idx, number in enumerate(chess[x][y]): # 인덱스를 이용해서 옮길 말을 정함
        if number == horse_num:
            horse_add.extend(chess[x][y][idx:])
            chess[x][y] = chess[x][y][:idx]
            break

    if pan[mx][my] == 1: # 빨간색을 만나면 옮길 말을 뒤집기
        horse_add.reverse()

    for h in horse_add: # 나머지 경우는 그냥 옮기면 됨
        horse[h][0], horse[h][1] = mx, my # 말의 정보를 담은 리스트에 정보 업데이트
        chess[mx][my].append(h) # 말 이동(쌓아 올리기)

    if len(chess[mx][my]) >= 4: # 말이 4개 이상 쌓이면 게임 종료를 알리는 False 리턴
        return False

    return True # 말이 4개 이상 안쌓였으면 계속 게임을 진행하는 True 리턴


while True:

    flag = False
    if turn > 1000: # 턴이 1000회가 넘으면 -1 출력
        print(-1)
        break

    for l in range(k): # 말의 번호를 인자로 넘겨줌
        if solve(l) == False:
            flag = True
            break

    turn += 1
    if flag == True:
        print(turn)
        break

    

설명

너무 어려워서 참고 자료 많이 참고..

참고 자료

https://unie2.tistory.com/1005

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글