1913번 달팽이 | 뭐라도 하겠지

1913번 달팽이

이왜틀?


img01

1913번 달팽이 - 백준

달팽이 그리는 것만 있으면 아주 기초적인 문제인데
좌표를 구하는게 추가되었다.

import java.util.*;interface Main{static void main(String[]z){Scanner s=new Scanner(System.in);int n=s.nextInt(),y=s.nextInt(),g=1,i=n/2,j=n/2,k=1;int[][]a=new int[n][n];a[i][j]=k;boolean u=true;h:for(;;){if(u){for(int l=1;l<=g;l++){a[--i][j]=++k;if(k==n*n)break h;}for(int l=1;l<=g;l++){a[i][++j]=++k;if(k==n*n)break h;}u=!u;g++;}else{for(int l=1;l<=g;l++){a[++i][j]=++k;if(k==n*n)break h;}for(int l=1;l<=g;l++){a[i][--j]=++k;if(k==n*n)break h;}u=!u;g++;}}for(int m=0;m<n;m++){for(int l=0;l<n;l++){k=a[m][l];System.out.print(k+(l==n-1?"\n":" "));if(k==y){i=m+1;j=l+1;}}}System.out.print(i+" "+j);}}

미친 뭔 짓을 한거임
대체 뭐가 문제였을까?
세상에 불만이 많았나?
때려치고 처음부터 풀자.

설계


다 그리고 좌표를 찾으려 하면 아마 시간초과에 걸릴 것이다.
달팽이를 그리면서 좌표를 찾는게 훨씬 빠르다.

구현


출발할 중앙 점부터 달팽이를 그린다.
찾으려는 타겟이 나오는 순간 해당 좌표를 확인한다.

N = int(input())
target = int(input())

x, y = N // 2, N // 2

# 달팽이 방향 위 오른쪽 아래 왼쪽
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

snail = [[0] * N for _ in range(N)]
n = 1
len = 1
tx, ty = 0, 0

snail[x][y] = n

# n == 1 일때 타겟좌표 체크
if n == target:
    tx, ty = x, y

while n < N * N:
    for i in range(4):
        for _ in range(len):
            x += dx[i]
            y += dy[i]

            if 0 <= x < N and 0 <= y < N:
                n += 1
                snail[x][y] = n
                
                if n == target:
                    # 타겟 좌표 미리 저장
                    tx, ty = x, y
        
        if i % 2 == 1:
            # 2번마다 길이 연장
            len += 1

for r in snail:
    print(' '.join(map(str, r)))
print(tx + 1, ty + 1) 

채점


img02

n == 1일때 타겟좌표 갱신 부분 추가하고 통과

반성


곰곰히 생각해보니까 저 자바 소스 숏코딩하려고 그랬던 것 같다.
숏코딩 그거 아무 의미 없는데…
보기 좋고 주석 달린 코드가 최고인데
그땐 몰랐지

코드 확인


Link to GitHub

Updated: