[문제]
https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
[분류]
구현 - 시뮬레이션
[구현 논리]
시뮬레이션 문제이기에 번뜩이는 아이디어는 필요없음
시키는대로 하되 체계적으로 코드를 짜야함.
뱀이 움직일 때
1)아무것도 안만날 경우
2)사과를 만날 경우
3)자신의 몸을 만날 경우
4)벽을 만날 경우
4가지로 나누고
매초가 끝날 때 방향정보 초기화하는 식으로 구현.
이때 3)몸을 만날 경우때문에 몸정보를 저장해야함.
필자는 새로운 맵을 만들어 몸정보를 저장하였음.
+꼬리 방향정보도 초기화하였음
[코드]
N = int(input())
K = int(input())
d = [[0]*N for _ in range(N)]
arr = [[3]*N for _ in range(N)]
for i in range(K):
x, y = map(int,input().split())
d[x-1][y-1] = 1
dirN = int(input())
direction = [tuple(input().split()) for _ in range(dirN)]
def directionRotate(dir, C):
if C == 'L':
if dir == 0:
dir = 3
else: dir -= 1
elif C == 'D':
if dir == 3:
dir = 0
else: dir += 1
return dir
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
arr[0][0] = 2
headdir = 1
taildir = 1
headx = 0
heady = 0
tailx = 0
taily = 0
time = 0
ind = 0
index = 0
len = 1
while(True):
time += 1
nx = headx + dx[headdir]
ny = heady + dy[headdir]
if nx>=N or nx<0 or ny>=N or ny<0:
break
elif arr[nx][ny] == 2:
break
elif d[nx][ny] == 1:
headx, heady = nx, ny
arr[nx][ny] = 2
len += 1
d[nx][ny] = 0
else:
headx, heady = nx, ny
arr[nx][ny] = 2
arr[tailx][taily] = 3
tailx += dx[taildir]
taily += dy[taildir]
if int(direction[index][0]) == time:
headdir = directionRotate(headdir, direction[index][1])
index += 1
if index == dirN: index = 0
if int(direction[ind][0]) == time - len + 1:
taildir = directionRotate(taildir, direction[ind][1])
ind += 1
if ind == dirN: ind = 0
print(time)
[피드백]
우선 뱀이 움직일때 4가지 경우로 나눠 큰 틀을 가지고
코드를 작성해 복잡하지 않을 수 있었음.
but 코드를 작성하는 과정에서 몸을 만나는 경우때문에 꼬리정보를 저장해야 한다는 사실을 깨달았을 때,
큐를 떠올리지 못하였음.
늘어난 몸의 순서가 있는데 순서를 고려하면 큐를 쓰는게 적확한데
이를 떠올리지 못하고 그냥 쌩으로 2차원배열초기화하고 지도에 뱀몸통정보 기록한 뒤,
꼬리 방향 정보도 초기화시켜 머리아팠음.
다음번엔 순서 정보가 있을 때 큐를 꼭 활용해보자. ㅎㅇㅌ!!
'PS > 코테 문제풀이' 카테고리의 다른 글
[프로그래머스/60059] 자물쇠와 열쇠 (0) | 2022.03.11 |
---|---|
[백준 1700번 / Python] 멀티탭 스케줄링 (0) | 2022.02.17 |
[백준 2879번 / Python] 코딩은 예쁘게 (0) | 2022.02.13 |
[문제]
https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
[분류]
구현 - 시뮬레이션
[구현 논리]
시뮬레이션 문제이기에 번뜩이는 아이디어는 필요없음
시키는대로 하되 체계적으로 코드를 짜야함.
뱀이 움직일 때
1)아무것도 안만날 경우
2)사과를 만날 경우
3)자신의 몸을 만날 경우
4)벽을 만날 경우
4가지로 나누고
매초가 끝날 때 방향정보 초기화하는 식으로 구현.
이때 3)몸을 만날 경우때문에 몸정보를 저장해야함.
필자는 새로운 맵을 만들어 몸정보를 저장하였음.
+꼬리 방향정보도 초기화하였음
[코드]
N = int(input())
K = int(input())
d = [[0]*N for _ in range(N)]
arr = [[3]*N for _ in range(N)]
for i in range(K):
x, y = map(int,input().split())
d[x-1][y-1] = 1
dirN = int(input())
direction = [tuple(input().split()) for _ in range(dirN)]
def directionRotate(dir, C):
if C == 'L':
if dir == 0:
dir = 3
else: dir -= 1
elif C == 'D':
if dir == 3:
dir = 0
else: dir += 1
return dir
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
arr[0][0] = 2
headdir = 1
taildir = 1
headx = 0
heady = 0
tailx = 0
taily = 0
time = 0
ind = 0
index = 0
len = 1
while(True):
time += 1
nx = headx + dx[headdir]
ny = heady + dy[headdir]
if nx>=N or nx<0 or ny>=N or ny<0:
break
elif arr[nx][ny] == 2:
break
elif d[nx][ny] == 1:
headx, heady = nx, ny
arr[nx][ny] = 2
len += 1
d[nx][ny] = 0
else:
headx, heady = nx, ny
arr[nx][ny] = 2
arr[tailx][taily] = 3
tailx += dx[taildir]
taily += dy[taildir]
if int(direction[index][0]) == time:
headdir = directionRotate(headdir, direction[index][1])
index += 1
if index == dirN: index = 0
if int(direction[ind][0]) == time - len + 1:
taildir = directionRotate(taildir, direction[ind][1])
ind += 1
if ind == dirN: ind = 0
print(time)
[피드백]
우선 뱀이 움직일때 4가지 경우로 나눠 큰 틀을 가지고
코드를 작성해 복잡하지 않을 수 있었음.
but 코드를 작성하는 과정에서 몸을 만나는 경우때문에 꼬리정보를 저장해야 한다는 사실을 깨달았을 때,
큐를 떠올리지 못하였음.
늘어난 몸의 순서가 있는데 순서를 고려하면 큐를 쓰는게 적확한데
이를 떠올리지 못하고 그냥 쌩으로 2차원배열초기화하고 지도에 뱀몸통정보 기록한 뒤,
꼬리 방향 정보도 초기화시켜 머리아팠음.
다음번엔 순서 정보가 있을 때 큐를 꼭 활용해보자. ㅎㅇㅌ!!
'PS > 코테 문제풀이' 카테고리의 다른 글
[프로그래머스/60059] 자물쇠와 열쇠 (0) | 2022.03.11 |
---|---|
[백준 1700번 / Python] 멀티탭 스케줄링 (0) | 2022.02.17 |
[백준 2879번 / Python] 코딩은 예쁘게 (0) | 2022.02.13 |