티스토리 뷰
문제유형: 삼성 전자의 전형적인 시뮬레이션 문제
1. 내 풀이(풀이 단계적 힌트 참고)
#n,m을 공백으로 구분해서 입력받기
n,m = map(int, input().split())
x,y,direction = map(int, input().split())
#방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화
d = [ [0] * m for _in range(n) ]
#현재 좌표 값 방문 처리(0->1)
d[x][y] = 1
#전체 맵 정보를 입력받음(이 부분까지 입력받지는 몰랐네)
array = []
for i in range(n):
array.append(list(map(int, input().split())))
#책에 나와있는 대로 '북동남서' 방향 정의(인덱스는 direction, direction= 0,1,2,3에 각각 해당)
dx = [-1, 0, 1, 0]
dy = [0,1,0,-1]
#왼쪽으로 회전하는 함수 정의
def turn_left():
global direction #direction이 함수 밖에서 생성되었기 때문에
direction -=1
if direction ==-1:
direction =3
#시뮬레이션 시작
count = 1
turn_time =0 #회전한 숫자
while True:
#왼쪽으로 회전
turn_left()
#이동한 x,y좌표 생성
nx = x+dx[direction]
ny = y+dy[direction]
#회전한 이후 정면에 가보지 않은(d[nx][ny]==0) 육지(array[nx][ny]==0)가 존재하는 경우 이동
if d[nx][ny] ==0 and array[nx][ny]==0:
d[nx][ny] =1 #방문했음을 표시
#현재 좌표를 변경
x = nx
y = ny
count+=1 #방문한 칸의 수 +1
turn_time=0 #회전 초기화
continue
#회전한 이후 정면에 가보지 않은 칸이 없거나 바다인 경우=> 일단 한번 더 회전해야 함
else:
turn_time+=1 #방향 회전하는 수 +1
#네 방향 모두 갈 수 없는 경우=> 방향은 유지하고 한 칸 뒤로 이동
if turn_time==4:
nx = x - dx[direction]
ny = y - dy[direction]
if d[nx][ny]==1 or array[nx][ny]==1: break #뒤쪽 방향이 바다이거나 이미 가본 칸이면 움직임 멈춤
else:
x,y= nx,ny
turn_time=0
continue
print(count)
2. 모범 답안
#n,m을 공백으로 구분해서 입력받기
n,m = map(int, input().split())
x,y,direction = map(int, input().split())
#방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화
d = [ [0] * m for _in range(n) ]
#현재 좌표 방문 처리
d[x][y] = 1
#전체 맵 정보를 입력받음(이 부분까지 입력받지는 몰랐네)
array = []
for i in range(n):
array.append(list(map(int, input().split())))
#책에 나와있는 대로 '북동남서' 방향 정의
dx = [-1, 0, 1, 0]
dy = [0,1,0,-1]
#왼쪽으로 회전하는 함수 정의
def turn_left():
global direction
direction -=1
if direction ==-1:
direction =3
#시뮬레이션 시작
count = 1
turn_time =0 #회전한 숫자
while True:
#왼쪽으로 회전
turn_left()
nx = x+dx[direction]
ny = y+dy[direction]
#회전한 이후 정면에 가보지 않은(d[nx][ny]==0) 육지(array[nx][ny]==0)가 존재하는 경우 이동
if d[nx][ny] ==0 and array[nx][ny]==0:
d[nx][ny] =1 #방문했음을 표시
#현재 좌표를 변경
x = nx
y = ny
count+=1 #방문한 칸의 수 +1
turn_time=0 #회전 초기화
continue
#회전한 이후 정면에 가보지 않은 칸이 없거나 바다인 경우
else:
turn_time+=1 #방향 회전하는 수 +1
#네 방향 모두 갈 수 없는 경우
if turn_time==4:
nx = x-dx[direction]
ny = y-dy[direction]
#뒤로 갈 수 있다면 이동 후 1단계로 돌아간다.
if array[nx][ny] ==0:
x = nx
y = ny
#뒤가 바다라 못가는 경우
else:
break
turn_time=0
print(count)
피드백:
이런 지문이 긴 문제들은 주어진 조건대로 차근차근 충실하게 코딩하는게 답인 것 같다.
'코딩테스트👩💻' 카테고리의 다른 글
재귀함수 공부 (0) | 2022.04.14 |
---|---|
코딩테스트를 위한 파이썬 문법 (0) | 2022.03.17 |
[이코테] 구현_part2:왕실의 나이트 (0) | 2022.03.07 |
[이코테] 그리디_part3:문자열 뒤집기 (0) | 2022.03.07 |
[이코테] 그리디_part3:곱하기 혹은 더하기 (0) | 2022.03.07 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 큰수의법칙
- 라우팅알고리즘
- aimd
- 네트워크
- 토익 #900점 #토익독학길잡이 #토익독학 #토익공부법
- 정보컴퓨터
- DFS와BFS
- 데이터베이스시스템
- ssafy #싸피 #8기 #ssafy전공자
- 이코테
- slowstart
- CSMA
- 느는중
- 매체접근제어
- 연산자끼워넣기
- 거리벡터
- 백준1260
- 14888
- 백준 #1158 #java
- 그리디
- Colab
- tahoe
- tcp/ip흐름제어
- 링크상태
- 문자열뒤집기
- boj1260
- reno
- 파이썬
- 모험가길드
- 1이될때까지
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함