상세 컨텐츠

본문 제목

새로운 게임2

코딩테스트/구현

by 수타. 2023. 7. 31. 19:29

본문

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

 

17837번: 새로운 게임 2

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

www.acmicpc.net

문제요약:

2차원 배열에서 공간의 색은 3가지가 있고, (흰색, 빨강색, 파랑색) , 각 색에 말이 올라갈때마다 조건이 다를때, 한 곳에 4개이상의 말이 올라간순간의 횟수를 구하여라

 

소요시간:

1시간

 

난이도:

골드2

 

제출횟수:

1회

 

코딩:

import sys
input = sys.stdin.readline
from collections import defaultdict,deque

n,k = map(int,input().split())

#0은 흰색, 1은 빨간색, 2는 파란색
arr = [list(map(int,input().split())) for _ in range(n)]

chess = defaultdict(list)

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

for i in range(k):
    y,x,dir = map(int,input().split())
    chess[(y-1)*n + (x-1)].append(i)
    cur_yx.append([y-1,x-1,dir-1])

def go():
    for i,cur in enumerate(cur_yx):
        y,x,dir = cur
        ny = y +dy[dir]
        nx = x +dx[dir]
        #밖이거나 파란색이면
        if ny<0 or nx<0 or ny>=n or nx>=n or arr[ny][nx]==2:
            #방향바꾸기
            if dir%2:
                dir-=1
            else:
                dir+=1
            ny = y +dy[dir]
            nx = x +dx[dir]
            cur_yx[i] = [y,x,dir]
            #방향바꾼후에도 못움직이면 dir갱신만해주고 유지
            if ny<0 or nx<0 or ny>=n or nx>=n or arr[ny][nx]==2:
                continue
                
        #하얀색이면
        if arr[ny][nx] == 0:
            piv = chess[y*n+x].index(i)
            #자기포함 위에를 통체로 옮기기
            chess[ny*n+nx].extend(chess[y*n+x][piv:])
            #위치갱신
            for i in chess[y*n+x][piv:]:
                cur_yx[i] = [ny,nx,cur_yx[i][2]]
            #있던곳은 지우기
            chess[y*n+x] = chess[y*n+x][:piv]
        if arr[ny][nx] == 1:
            piv = chess[y*n+x].index(i)
            #자기포함 위에를 통체로 뒤집어서 옮기기
            chess[ny*n+nx].extend(chess[y*n+x][piv:][::-1])
            #위치갱신
            for i in chess[y*n+x][piv:]:
                cur_yx[i] = [ny,nx,cur_yx[i][2]]
            #있던곳은 지우기
            chess[y*n+x] = chess[y*n+x][:piv]
        
        if len(chess[ny*n+nx]) >=4:
            return 1
    return 0

for i in range(1,1001):
    
    if go():
        print(i)
        break
else:
    print(-1)

전체적인 코딩은 빡빡한 구현에 가까운데, 각 체스판에 말이 쌓이는걸 구현하기 위해, defaultdict(list)를 이용한후 1차원으로 돌려주어 , 각자리에 리스트를 할당해 주었고, 필요한만큼만 이동시켜주었다.

사실 코딩을 한 이후에 약 30분동안 오류를 찾지못해 디버깅을 했었는데, cur_yx[i] = [y,x,dir] 이 문장이 그 아래 이프문 안에 있었는데, 그렇기 때문에 파란색이거나 벽에 부딫히고 방향을 바꿨어도 또 벽에 부딫히는 상황이아니라면 dir저장이 되지않아 몇 테케에서 통과를 하지 못하였다.

 

'코딩테스트 > 구현' 카테고리의 다른 글

마법사 상어와 파이어  (0) 2023.08.02
원판 돌리기  (0) 2023.07.31
미세먼지 안녕!  (0) 2023.07.28
치킨 배달  (0) 2023.07.26
드래곤 커브  (0) 2023.07.26

관련글 더보기