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)