https://www.acmicpc.net/problem/1913
입력
첫 번째 줄 : n
n : 행, 열의 길이
n^2 == 첫 번째 수
두 번째 줄 : m
m : 좌표를 찾을 값
출력
1) 달팽이 결과 출력
2) m의 좌표 출력 / (1, 1)부터 시작함
삼성 코딩테스트 등에서 종종 사용되는 나선형으로 숫자 출력하는 문제입니다.
다음 숫자를 작성할 경로를 나타내는 dx dy를 따라서 쭉 숫자를 작성하다가, 범위를 벗어나거나 이미 작성된 위치가 있는 경우 방향을 바꿔서 다시 숫자를 채워가는 방식을 적용하면 쉽게 풀 수 있습니다.
하 우 상 좌 순으로 달팽이가 돌기 때문에 dx dy를 맞춰서 만들었습니다.
# 하 우 상 좌
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
def print_arr(arrs):
for i in range(len(arrs)):
for j in range(len(arrs[0])):
print(arrs[i][j], end=" ")
print()
n = int(input())
m = int(input())
arr = [[0] * n for i in range(n)]
now = n*n
x = 0
y = 0
d = 0
ax = 0
ay = 0
while now > 0:
arr[x][y] = now
# 좌표를 찾고자 하는 값이라면
if now == m:
ax = x + 1
ay = y + 1
now -= 1
nx = x + dx[d]
ny = y + dy[d]
# 다음 위치가 범위를 벗어남 or 이미 채워진 경우
if nx < 0 or nx >= n or ny < 0 or ny >= n or arr[nx][ny] != 0:
# 방향을 바꿔줌
d = (d + 1) % 4
x = x + dx[d]
y = y + dy[d]
print_arr(arr)
print(ax, ay)
~~
해당 코드는 에디터가 코드 연습을 위해 직접 작성하였습니다.
혹시 오류가 있거나 더 좋은 코드 방향성을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!
python source : https://github.com/ssh5212/conding-test-practice
java source : https://github.com/ssh5212/coding-test-java