삼성기출문제이다!
문제만 읽어봐도 완전 구현구현한 스타일의 문제..
n,m,y,x,k = map(int,input().split())
back = [[0] * m for _ in range(n)]
col = [0,0,0,0]
row = [0,0,0,0]
floor = 0
move = {1: [0,1], 2: [0,-1], 3: [-1,0] ,4:[1,0] }
for i in range(n):
back[i] = list(map(int,input().split()))
order_list = list(map(int,input().split()))
def mapcheck(y,x):
global floor
if back[y][x] == 0:
back[y][x] = floor
else :
floor = back[y][x]
back[y][x] = 0
for order in order_list:
ny , nx = y + move[order][0], x + move[order][1]
if nx < 0 or ny < 0 or nx>=m or ny >=n:
continue
x,y = nx,ny
if order == 1:
row.insert(0,row.pop())
floor = row[3]
col[1] = row[1]
mapcheck(y,x)
row[3] = floor
col[3] = floor
print(row[1])
elif order == 2:
row.append(row.pop(0))
floor = row[3]
col[1] = row[1]
mapcheck(y,x)
row[3] = floor
col[3] = floor
print(row[1])
elif order == 3:
col.append(col.pop(0))
floor = col[3]
row[1] = col[1]
mapcheck(y,x)
row[3] = floor
col[3] = floor
print(col[1])
else:
col.insert(0,col.pop())
floor = col[3]
row[1] = col[1]
mapcheck(y,x)
row[3] = floor
col[3] = floor
print(col[1])
주사위의 움직임을 받아서 orders 라는 배열에 넣어주고 하나씩 꺼내서 써있는대로 이동시켰다.
0
0 1 2 3
2
3
주사위에 써있는 숫자들을
이런 구조로 생각해보았다.
1번이 윗면이고 3번이 바닥면이다.
가로줄, 세로줄은 1번과 3번을 공유하고있는 구조이다.
각각을 row, col 배열로 만들어서 매 변화마다 상태를 저장해주는 방식으로 구현해보았다.
바닥면인 3번을 공유한다는건 잘 처리해줬는데 윗면인 1번도 공유한다는걸 빼먹어서 한참 걸렸다. 일부 테스트케이스가 틀리길래 왜틀린지 몰라서 직접 주사위 만들고 A4 용지에 지도 그려서 주사위 굴리면서 해봤다 ㅠㅠ..
지금 정리하면서 보니깐 이걸 왜 빼먹었나 싶지만 아까는 분명 안보였다..
문제에 주어진 조건대로 지도에 숫자가 써있냐, 0이냐에 따라서 하라는대로 처리해주는 mapcheck 라는 함수를 만들었다.
orders의 order들을 하나씩 거내서 1,2,3,4 에따라 동서북남 으로 이동시키는데 각각 이동마다 주사위의 숫자들이 어떻게 변하는지 if문으로 나누어서 각각 작성해주었다.
하지만 이 문제의 핵심은 따로있다
사실 역대급 낚시가 아닌가 생각되는데..
인풋내용을 잘보면 주사위를 놓는곳의 좌표가 x,y가 바뀌어있다. 세로가 N, 가로가 M이니깐
즉, 세로축 좌표가 x, 가로축 좌표가 y이다
하지만 제공해준 테스트케이스는 (0,0), (1,1)처럼 xy 좌표가 같은것만 주어서 오류없이 다 잘돌아간다. 이거 노리고 이렇게 준거면 진짜 악마가 아닐까...
그래서 테스트케이스 돌려보면 분명 다맞는데,,, 아무리 검토를 해봐도 논리가 틀린게 없는데,,, 직접 주사위까지 굴려봐도 맞는데.... 왜 제출하면 틀릴까? 미치게만드는 그런 함정이 숨어있다
오늘의 교훈
문제를 더 꼼꼼히 읽자....