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저장이 되지않아 몇 테케에서 통과를 하지 못하였다.