일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 난 분명히 1시에 잘 생각이었는데
- 2시야
- jupyter_notebook
- 또 2시야....
- 선택정렬
- 데이터분석
- 멋쟁이사자처럼부트캠프
- 또 2시네
- 멋쟁이사자처럼후기
- 23883
- ELU
- 자동_형변환
- BOJ
- 정렬
- root_directory
- 다 쓰고보니깐
- TDB
- 백준
- 알고리즘
- activation_function
- astreisk
- 몰라 뭐가 너무 많아졌어
- 멋사
- 5기
- Python
- O(logN)
- 파이썬
- 다 쓰고 보니깐 1시 반이야
- 멋쟁이사자처러후기
- comprehesion
Archives
- Today
- Total
유사개발자 샤이와 무지
게임 개발[Implement] -1 #이것이 코딩테스트다 본문
현민이는 게임 캐릭터가 맵 안에서 움직이는 시스템을 개발 중이다. 캐릭터가 있는 장소는 1 X 1 크기의 정사각형으로 이뤄진 N X M 크기의 직사각형으로, 각각의 칸은 육지 또는 바다이다. 캐릭터는 동서남북 중 한 곳을 바라본다.
맵의 각 칸은 (A, B)로 나타낼 수 있고, A는 북쪽으로부터 떨어진 칸의 개수, B는 서쪽으로부터 떨어진 칸의 개수이다. 캐릭터는 상하좌우로 움직일 수 있고, 바다로 되어 있는 공간에는 갈 수 없다. 캐릭터의 움직임을 설정하기 위해 정해 놓은 매뉴얼은 이러하다.
1. 현재 위치에서 현재 방향을 기준으로 왼쪽 방향(반시계 방향으로 90도 회전한 방향)부터 차례대로 갈 곳을 정한다.
2. 캐릭터의 바로 왼쪽 방향에 아직 가보지 않은 칸이 존재한다면, 왼쪽 방향으로 횐전한 다음 왼쪽으로 한 칸을 전진한다. 왼쪽 방향에 가보지 않은 칸이 없다면, 왼쪽 방향으로 회전만 수행하고 1단계로 돌아간다.
3. 만약 네 방향 모두 이미 가본 칸이거나 바다로 되어 있는 칸인 경우에는, 바라보는 방향을 유지한 채로 한 칸 뒤로 가고 1단계로 돌아간다. 단, 이때 뒤쪽 방향이 바다인 칸이라 뒤로 갈 수 없는 경우에는 움직임을 멈춘다.
현민이는 위 과정을 반복적으로 수행하면서 캐릭터의 움직임에 이상이 있는지 테스트하려고 한다. 메뉴얼에 따라 캐릭터를 이동시킨 뒤에, 캐릭터가 방문한 칸의 수를 출력하는 프로그램을 만드시오.
난이도: ●●○| 풀이시간 20m | 시간제한 1초 | 메모리 128mb
<input case>
첫째 줄에 맵의 세로 크기 N과 가로 크기 M을 공백으로 구분하여 입력한다.
(3 <= N, M <= 50)둘째 줄에 게임 캐릭터가 있는 칸의 좌표 (A, B)와 바라보는 방햔 d가 각각 서로 공백으로 구분하여 주어진다. 방향 d의 값으로는 다음과 같이 4가지가 존재한다.
0 : 북쪽
1 : 동쪽
2 : 남쪽
3 : 서쪽셋째 줄부터 맵이 육지인지 바다인지에 대한 정보가 주어진다. N개의 줄에 맵의 상태가 북쪽부터 남쪽 순서대로, 각 줄의 데이터는 서쪽부터 동쪽 순서대로 주어진다. 맵의 외각은 항상 바다로 되어 있다.
0 : 육지
1 : 바다
처음에 게임 캐릭터가 위치한 칸의 상태는 항상 육지이다.
<Output case>
첫째 줄에 이동을 마친 후 캐릭터가 방문한 칸의 수를 출력한다.
input example | Output example |
4 4 1 1 0 // (1, 1)에 북쪽(0)을 바라보고 서 있는 캐릭터 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 |
3 |
<Idea>
Q1. 일단 코드 길이가 엄청 길어지는건 확정이네...
A1. 그치 벌써 하기 싫어지지만 어쩌겠어! 네가 개발자인데 해야지 ㅋㅋ 자자 문제를 봅시다. 일단 값은 어찌저찌 받았으니 되었고. 회전을 해야하는 경우가 좀 있으니까 회전하는건 함수로 만드는게 편하겠네
Q2. 그러게 아까 순수하게 그 케이스를 기준으로 먼저 1로 방문처리를 시키고 주변을 둘러보자.
A2. 그래 그럼 그렇게 둘러보고 이동까지 하면 step1,2가 한방에 끝나버리네.
Q3. 그치 그럼 이제 step 3를 보자. 일단은 사방을 둘러봐서 갈 곳이 있는지를 봐야하네 갈 곳이 있으면 돌아서 아까 전에 하던걸로 돌려보내면 되는거고 아니면 step 3 최초 상태에서 후진시킨다. 근데 운이 나쁘게도 뒤가 바다면 시뮬레이션을 중지하라 이런 느낌이네.
A3. 그러네 근데 우리가 생각을 1로 방문처리 했으면 컴퓨터는 구분 못하는거 아닌가?
Q4. 주어진 케이스에선 문제가 없으니 일단 1차적으로 구현을 해보자
A4. 흠...(마음에 안듦) 일단 그래 구현을 해 봐야 변형을 하기 편하긴 할테니까?
data= list(map(int, input().split()))
x, y, sight=map(int, input().split())
now=(x,y)
#변수 세팅
dir=[(0,1), (1,0), (0,-1), (-1,0)]
table=[]
count=0
for i in range(data[1]):
table.append(list(map(int,input().split())))
def turn(): #회전하는 함수
global sight
if sight < 1: sight=3
else: sight -= 1
#simulation start
while 1:
turn_count=0
#step I
#step II
if table[now[0]][now[1]]!=1: #현 위치가 방문하지 않은 장소였다면
count+=1 #1을 더해주고
table[now[0]][now[1]]=1 #테이블을 방문처리 해줍니다.
nx= now[0] + dir[sight][0]
ny= now[1] + dir[sight][1]
if table[nx][ny] != 0: #만약 앞 테이블이 방문한 적 있거나 바다라면
turn()
continue;
now=(nx,ny)
#step III
while turn_count < 5: #사방을 확인해줍니다.
turn()
turn_count+=1
nx= now[0] + dir[sight][0]
ny= now[1] + dir[sight][1]
if table[nx][ny] != 1: #만약 방문한 적 없는 위치가 존재한다면 이하는 작동할 이유가 없으니 최상단으로 돌아갑니다.
continue
nx= now[0] - dir[sight][0]
ny= now[1] - dir[sight][1]
if table[nx][ny]==1:
count+=1 #이 케이스에선 최상단으로 올라가지 않으므로 1로 마무리 밑 움직인 횟수를 추가로 체크해줍니다.
table[now[0]][now[1]]=1
break #뒤를 봤는데 바다이거나 방문한 적 있다면 멈춰줍니다.
now=(nx,ny)
print(count)
다음 글에서 이어서 이미 방문한 곳에 추가적으로 갈 수 있는 길이 있을 수도 있으니 그러한 경우에 대해 고려해보겠습니다
'WIL > algorithm' 카테고리의 다른 글
음료수 얼려먹기[DFS/BFS] #이것이 코딩테스트다 (0) | 2023.04.14 |
---|---|
게임 개발[Implement] -2 #이것이 코딩테스트다 (0) | 2023.03.19 |
왕실의 나이트[Implement] #이것이 코딩테스트다 (0) | 2023.03.14 |
[간단한 알고리즘] 간단하게 지맥 레진 계산기를 만들어보자 (0) | 2023.03.13 |
1로 만들기 [Greedy] #이것이 코딩테스트다 (0) | 2023.03.04 |
Comments