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)
채점
n == 1일때 타겟좌표 갱신 부분 추가하고 통과
반성
곰곰히 생각해보니까 저 자바 소스 숏코딩하려고 그랬던 것 같다.
숏코딩 그거 아무 의미 없는데…
보기 좋고 주석 달린 코드가 최고인데
그땐 몰랐지
코드 확인