CodingTest/Baekjoon
Baekjoon 1913 | 달팽이(Python)
tmdrn9
2025. 2. 21. 15:35
📌문제
SILVER3 / 구현
https://www.acmicpc.net/problem/1913
📌문제 분석 및 설계
이 문제는 삼성을 준비한다면 무조건 숙지해가야하는 코드! 삼성 기출을 풀어보면 알 수 있듯이 삼성이 좋아하는 구현이다, 달팽이.
해당 문제는 방향을 두번 바꿀때마다 같은 방향으로 가는 길이가 +1 되는게 핵심이다.
9 2 3
8 1 4
7 6 5 를 예시로 들어보면
(상)1→2, (우)2 →3 두가지 방향으로 직진했다면, 방향을 두번 바꿨으니 다음부터는 직진을 한번씩 더 하게되어
(하)3 →4 →5/(좌)5 →6 →7이렇게 이동한다
📌소스 코드
n = int(input())
k = int(input())
grid =[[0]*n for _ in range(n)]
dx,dy=[-1,0,1,0],[0,1,0,-1] #상 우 하 좌
cnt=1 #grid 채워넣는 값
i,j=n//2,n//2 #시작 위치
grid[i][j]=cnt #시작 위치에 1삽입
d=0 #방향 인덱스
twice=0 #2가 되면 loop+1(방향을 두번 바꿨을때마다 동일한 방향으로 나아가는 길이가 +1됨)
loop=1 #같은 방향으로 이동하는 거리
answeri,answerj=(n//2)+1,(n//2)+1 #k==1일때로 초기화
end=True
while end:
for _ in range(loop):
ni,nj=i+dx[d],j+dy[d]
if ni<0 or nj<0:
end=False
break
cnt+=1
grid[ni][nj]=cnt
i,j=ni,nj
if cnt==k:
answeri,answerj=i+1,j+1
d=(d+1)%4
twice+=1
if twice==2:
loop+=1
twice=0
for row in grid:
for a in row:
print(a, end=' ')
print()
print(answeri, answerj)