반응형
문제
홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.
9 | 2 | 3 |
8 | 1 | 4 |
7 | 6 | 5 |
25 | 10 | 11 | 12 | 13 |
24 | 9 | 2 | 3 | 14 |
23 | 8 | 1 | 4 | 15 |
22 | 7 | 6 | 5 | 16 |
21 | 20 | 19 | 18 | 17 |
N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.
입력
첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.
출력
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.
예제 입력 1
7
35
예제 출력 1
49 26 27 28 29 30 31
48 25 10 11 12 13 32
47 24 9 2 3 14 33
46 23 8 1 4 15 34
45 22 7 6 5 16 35
44 21 20 19 18 17 36
43 42 41 40 39 38 37
5 7
소스코드
import sys
n=int(sys.stdin.readline())
m=int(sys.stdin.readline())
# now: 배열에 들어갈 값
# x: 표의 x좌표, y: 표의 y좌표
# inc: 이동량
# pm: 방향
now,x,y=1,n//2,n//2
inc=1
pm=-1
arr=[[0]*n for _ in range(n)] # n*n 크기의 배열을 만든다.
arr[x][y]=now # 배열에 첫번째 값(1)을 저장한다.
now+=1 # 배열에 들어갈 값을 1 증가시킨다.
while now<n**2: # 배열에 값이 다 들어갈 때까지 반복한다.
if x<0 or y<0 or x>=n or y>=n: break
for i in range(inc): # inc만큼 y좌표로 이동하며 배열에 값을 대입한다.
# y 증감
y+=pm
if y<0 or y>=n: break # y좌표가 범위를 벗어나면 반복문을 종료한다.
else:
if now>n**2: break # 배열의 값이 다 차면 반복문을 종료한다.
arr[x][y]=now # 배열에 값을 저장하고 값을 1만큼 증가시킨다.
now+=1
pm*=-1 # 위쪽, 오른쪽, 아래쪽, 왼쪽 방향을 반복하기 위해 -1을 곱해준다.
for i in range(inc):
# x 증감
x+=pm
if x<0 or x>=n: break
else:
if now>=n**2: break
arr[x][y]=now
now+=1
inc+=1 # 달팽이 모양을 증가시키기 위해 이동량을 1만큼 증가한다.
for i in range(n):
for j in range(n):
print(str(arr[j][i]),end=' ')
if arr[j][i]==m:
mx=i+1
my=j+1
print()
print(str(mx)+' '+str(my))
https://sujin7837.tistory.com/133
반응형
'코딩테스트 > Baekjoon Online Judge' 카테고리의 다른 글
[입출력] 코딩테스트 파이썬 입출력(11718, 11720, 11021) (0) | 2021.11.23 |
---|---|
[백준] 1058번 친구 (0) | 2021.09.15 |
[백준] 1365번 꼬인 전깃줄 (0) | 2021.09.02 |
[백준] 2056번 작업 (0) | 2021.09.02 |
[백준] 1461번 도서관 (0) | 2021.08.25 |