본문 바로가기

알고리즘/백준

[백준] 17837번 : 새로운게임

728x90

17837번: 새로운 게임 2

 

17837번: 새로운 게임 2

재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하

www.acmicpc.net

🤔 문제분석

시뮬레이션 문제로 주어진 조건을 잘 분석하여 분기처리하여 문제를 풀면 풀 수 있다. 3가지 로직을 구현하여 조합하면 된다.

  • 파란색과 범위를 벗어나는 조건
  • 자기자신위에 있는 배열을 구하는 방법
    • 자기자신위에 배열을 구하는방법은 현재 채스판의 위치에서 자기자신의 인덱스를 찾아서 그 인덱스를 기준으로 모든 값을 복사한다. 그리고 그 인덱스를 기준으로 모든값을 제거시킨다.
  • 빨간색일때 배열을 뒤집는방법
    • 파이썬의 리스트 컴프리핸션을 사용하여 뒤집었다. [-1::-1] 사용

💻 코드

import sys
moves = [(0, 1), (0, -1), (-1, 0), (1, 0)]
WHITE = 0
RED = 1
BLUE = 2

input = sys.stdin.readline
N, K = map(int, input().split())

chess = [[[] for _ in range(N)] for _ in range(N)]
horse = []
table = [list(map(int, input().split())) for _ in range(N)]

def chage_direction(dir):
    if dir in [0, 2]:
        return dir + 1

    if dir in [1, 3]:
        return dir - 1

def solve(i):
    y, x , dir = horse[i]
    dy, dx = moves[dir]
    ny, nx = dy + y, dx + x
    if nx >= N or nx < 0 or ny >=N or ny < 0 or table[ny][nx] == BLUE:
        dir = chage_direction(dir)
        horse[i][2] = dir
        dy, dx = moves[dir]
        ny, nx = dy + y, dx + x
        if nx >= N or nx < 0 or ny >=N or ny < 0 or table[ny][nx] == BLUE:
            return False
    
    horse_up = []
    for idx, num in enumerate(chess[y][x]):
        if num == i:
            horse_up.extend(chess[y][x][idx:])
            chess[y][x] = chess[y][x][:idx]
            break
    
    if table[ny][nx] == RED:
        horse_up = horse_up[-1::-1]
    
    for num in horse_up:
        horse[num][0], horse[num][1] = ny, nx
        chess[ny][nx].append(num)
    
    if len(chess[ny][nx]) >= 4:
        return True
    else:
        return False
    
    
for i in range(K):
    y, x, d = map(int, input().split())
    y -= 1
    x -= 1
    d -= 1
    chess[y][x].append(i)
    horse.append([y, x, d])

is_finished = False
time = 0
while True:
    if time > 1000:
        print(-1)
        break
    
    for i in range(K):
        if solve(i):
            is_finished = True
            break
        
    time += 1    
    if is_finished:
        print(time)
        break
    

🎯 피드백 및 개선사항

시물레이션이나 구현문제를 풀때 마음이 급해지면 오히려 문제가 잘 안풀리는 것같습니다. 문제가 잘 안풀릴때 심호흡을 한번 하고 문제를 다시 접근해 보는건 어떨까요~? 😀

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 21610번 : 마법사 상어와 비바라기  (0) 2024.02.29
[백준] 19237번 : 어른 상어  (0) 2024.02.28
[백준] 17825번 : 주사위  (1) 2024.02.26
[백준] 4803번 : 트리  (1) 2024.02.26
[백준] 16120번 : PPAP  (0) 2024.02.26