17837: 새로운 게임 2

ewillwin·2023년 7월 17일
0

Problem Solving (BOJ)

목록 보기
130/230

풀이 시간

  • 1h 41m
  • 코드 다 짜놓고 "턴이 진행되던 중에 말이 4개 이상 쌓이는 순간 바로 종료"를 해줬어야했는데 바로 종료하지 않고 하나의 턴을 완료하고 말이 4개 이상 쌓인 곳이 있는 지를 확인하는 방식으로 했어서 뭐가 문제인지 한참 찾다가 한 시간을 까먹음.. 억까 아닌 억까다

구현 방식

  • 전반적인 구현 방식은 "17780: 새로운 게임"(click!)과 거의 비슷하다
  • 17780번과의 차이점은 0번 말부터 순서대로 이동하는데, 말이 가장 아래에 있지 않아도 이동을 수행한다는 점이다
    -> check[x][y]의 길이만큼 for문을 돌면서, i(현재 이동하고자 하는 horse의 번호)를 만난다면 해당 위치부터 pop을 수행하여 horse_num을 빼내고, 해당 horse_num의 위치를 변경해주고 check[nx][ny]에 horse_num을 append 해준다 (빨간색의 경우 tail에서부터 pop 수행)

코드

import sys
from collections import deque

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

N, K = map(int, sys.stdin.readline()[:-1].split())
board = []
for n in range(N):
    board.append(list(map(int, sys.stdin.readline()[:-1].split())))
horses = []; check = [[[] for _ in range(N)] for _ in range(N)]
for k in range(K):
    x, y, direction = map(int, sys.stdin.readline()[:-1].split())
    horses.append([x-1, y-1, direction-1]) #각 말별 정보
    check[x-1][y-1].append(k) #해당위치에 있는 말들의 정보

turn = 0
while True:
    turn += 1
    if turn > 1000:
        print(-1)
        exit()

    for i in range(len(horses)): #0번 말부터 순서대로 이동
        x, y, direction = horses[i]
        nx = x + dx[direction]; ny = y + dy[direction]

        if 0 <= nx < N and 0 <= ny < N:
            if board[nx][ny] == 0: #흰색
                for start in range(len(check[x][y])):
                    if check[x][y][start] == i:
                        for _ in range(len(check[x][y]) - start):
                            horse_num = check[x][y].pop(start)
                            horses[horse_num][0] = nx; horses[horse_num][1] = ny
                            check[nx][ny].append(horse_num)
                        break

            elif board[nx][ny] == 1: #빨간색
                for start in range(len(check[x][y])):
                    if check[x][y][start] == i:
                        for _ in range(len(check[x][y]) - start):
                            horse_num = check[x][y].pop()
                            horses[horse_num][0] = nx; horses[horse_num][1] = ny
                            check[nx][ny].append(horse_num)
                        break

            elif board[nx][ny] == 2: #파란색
                if direction == 0: direction = 1
                elif direction == 1: direction = 0
                elif direction == 2: direction = 3
                elif direction == 3: direction = 2
                horses[i][2] = direction

                nx = x + dx[direction]; ny = y + dy[direction]
                if 0 <= nx < N and 0 <= ny < N:
                    if board[nx][ny] == 0: #흰색
                        for start in range(len(check[x][y])):
                            if check[x][y][start] == i:
                                for _ in range(len(check[x][y]) - start):
                                    horse_num = check[x][y].pop(start)
                                    horses[horse_num][0] = nx; horses[horse_num][1] = ny
                                    check[nx][ny].append(horse_num)
                                break

                    elif board[nx][ny] == 1: #빨간색
                        for start in range(len(check[x][y])):
                            if check[x][y][start] == i:
                                for _ in range(len(check[x][y]) - start):
                                    horse_num = check[x][y].pop()
                                    horses[horse_num][0] = nx; horses[horse_num][1] = ny
                                    check[nx][ny].append(horse_num)
                                break
                    elif board[nx][ny] == 2: #파란색
                        nx = x; ny = y
                else: #범위 밖
                    nx = x; ny = y

        else: #범위 밖
            if direction == 0: direction = 1
            elif direction == 1: direction = 0
            elif direction == 2: direction = 3
            elif direction == 3: direction = 2
            horses[i][2] = direction

            nx = x + dx[direction]; ny = y + dy[direction]
            if 0 <= nx < N and 0 <= ny < N:
                if board[nx][ny] == 0: #흰색
                    for start in range(len(check[x][y])):
                        if check[x][y][start] == i:
                            for _ in range(len(check[x][y]) - start):
                                horse_num = check[x][y].pop(start)
                                horses[horse_num][0] = nx; horses[horse_num][1] = ny
                                check[nx][ny].append(horse_num)
                            break

                elif board[nx][ny] == 1: #빨간색
                    for start in range(len(check[x][y])):
                        if check[x][y][start] == i:
                            for _ in range(len(check[x][y]) - start):
                                horse_num = check[x][y].pop()
                                horses[horse_num][0] = nx; horses[horse_num][1] = ny
                                check[nx][ny].append(horse_num)
                            break
                elif board[nx][ny] == 2: #파란색
                    nx = x; ny = y
            else: #범위 밖
                nx = x; ny = y
        
        # 턴이 진행되던 중에 말이 4개 이상 쌓이는 순간 바로!!!! 종료
        if len(check[nx][ny]) >= 4:
            print(turn)
            exit()

결과

profile
💼 Software Engineer @ LG Electronics | 🎓 SungKyunKwan Univ. CSE

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

소중한 정보 감사드립니다!

답글 달기