일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 멋쟁이사자처러후기
- TDB
- jupyter_notebook
- O(logN)
- 몰라 뭐가 너무 많아졌어
- 멋쟁이사자처럼부트캠프
- comprehesion
- 정렬
- 난 분명히 1시에 잘 생각이었는데
- 5기
- ELU
- astreisk
- 또 2시네
- 자동_형변환
- Python
- 다 쓰고 보니깐 1시 반이야
- 알고리즘
- 선택정렬
- root_directory
- BOJ
- 멋쟁이사자처럼후기
- 23883
- activation_function
- 다 쓰고보니깐
- 데이터분석
- 또 2시야....
- 백준
- 파이썬
- 2시야
- 멋사
Archives
- Today
- Total
유사개발자 샤이와 무지
게임 개발[Implement] -2 #이것이 코딩테스트다 본문
2023.03.14 - [WIL/algorithm] - 게임 개발[Implement] -1 #이것이 코딩테스트다
게임 개발[Implement] -1 #이것이 코딩테스트다
현민이는 게임 캐릭터가 맵 안에서 움직이는 시스템을 개발 중이다. 캐릭터가 있는 장소는 1 X 1 크기의 정사각형으로 이뤄진 N X M 크기의 직사각형으로, 각각의 칸은 육지 또는 바다이다. 캐릭터
shymujee.tistory.com
지난번에 작성해뒀던 게임 개발 문제는 greedy method를 기반으로 하여 이하와 같은 케이스에서 제대로 작동하지 못하는 것을 확인하였습니다.
5 5
1 1 0
1 1 1 1 1
1 0 0 0 1
1 1 0 1 1
1 1 0 1 1
1 1 1 1 1
4
그래서 이 친구를 해결할 방법을 찾아보려고 합니다.
<Idea>
Q1. 그러면... 음.... 먼저 주변을 싹 둘러보는게 가장 간단한 답이지 않을까?
A1. 그치? 그러면 스택이나 큐를 가져다 써야할테니까 어떤걸로 할래?
Q2. 음... 그렇게 가면 거의 DFS나 BFS에 가까워지는데?
A2. 그치 이 문제는 조건만 다 빼고 input과 output만 보면 탐색문제잖아?
Q3. 생각해보니까 그러네 그러면 오늘은 BFS를 써보기로 할까?
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
queue=[]
for i in range(data[1]):
table.append(list(map(int,input().split())))
#simulation start
while 1:
break_= 0
#step I
#step II
#print("\n now is {},{}".format(now[0],now[1]))
if table[now[0]][now[1]]!=1: #현 위치가 방문하지 않은 장소였다면
count+=1 #1을 더해주고
table[now[0]][now[1]]=1 #테이블을 방문처리 해줍니다.
for i in range(4):
nx= now[0] + dir[i][0]
ny= now[1] + dir[i][1]
#print("1st phase: {}".format(table[nx][ny]))
if table[nx][ny] != 0: #만약 앞 테이블이 방문한 적 있거나 바다라면
continue
queue.append((now[0],now[1],i)) #방문 해야하는 방향들을 Queue에 저장해줍니다.
#print(queue)
#print(table,end='\n')
#다음 방문 값을 지정해줍니다.
temp=queue.pop(0)
nx=temp[0] + dir[temp[2]][0]; ny=temp[1] + dir[temp[2]][1]; sight=temp[2]
now=(nx,ny)
#step III
for i in range(4): #사방을 확인해줍니다.
nx= now[0] + dir[i][0]
ny= now[1] + dir[i][1]
#print("2nd phase: {}".format(table[nx][ny]))
if table[nx][ny] != 1: #만약 방문한 적 없는 위치가 존재한다면 이하는 작동할 이유가 없으니 최상단으로 돌아갑니다.
break_=1
break
if break_ != 0: continue
#꼬리는 세팅을 안하니까 체크해주고
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]==1 and not queue: break #뒤를 봤는데 바다이거나 방문한 적 있고 queue가 비어있으면 멈춥니다.
print(count)
5 5
1 1 0
1 1 1 1 1
1 0 0 0 1
1 1 0 1 1
1 1 0 1 1
1 1 1 1 1
5
원하는대로 결과가 나왔네요
<Review>
메뉴얼에서 원하는 방식대로 구현한건 아니었지만 새로운 방법으로 접근하는 것도 재밌었던 것 같습니다. 다음에는 원본의 틀을 깔끔하게 지킨 식으로 만들어(?) 보겠습니다
'WIL > algorithm' 카테고리의 다른 글
미로 탈출[DFS/BFS] #이것이 코딩테스트다 (0) | 2023.04.14 |
---|---|
음료수 얼려먹기[DFS/BFS] #이것이 코딩테스트다 (0) | 2023.04.14 |
게임 개발[Implement] -1 #이것이 코딩테스트다 (2) | 2023.03.14 |
왕실의 나이트[Implement] #이것이 코딩테스트다 (0) | 2023.03.14 |
[간단한 알고리즘] 간단하게 지맥 레진 계산기를 만들어보자 (0) | 2023.03.13 |
Comments