반응형
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net
문제
홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.
![](https://blog.kakaocdn.net/dn/TLVfi/btrvUAXLHb3/S8NbK9cP4cAw3Bb89FfAy0/img.png)
![](https://blog.kakaocdn.net/dn/plmSE/btrvPglWMLO/JwsWzaPs886EWT3H9wqkH1/img.png)
N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.
입력
첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.
출력
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.
예제 입력7
35 |
예제 출력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 |
풀이
위 그림과 같이 2씩 증가하며 우하좌상 방향으로 4번씩 반복하면서 숫자가 채워지는 것을 알 수 있다.
패턴에 맞춰 수를 채워넣도록 하자.
import sys
def draw():
global n
x = y = n//2
cnt = num = 2
d = [(0,1),(1,0),(0,-1),(-1,0)]
t = 0
board[x][y] = 1; x-=1; y-=1
while True:
for _ in range(4):
a,b = d[t]
for _ in range(cnt):
x+=a; y+=b
board[x][y] = num
if num==m:
ans[0]=x+1; ans[1]=y+1
if num==n**2:
return
num+=1
t = (t+1)%4
cnt+=2
x-=1; y-=1
n = int(input())
m = int(input())
board = [[0]*n for _ in range(n)]
ans = [n//2+1,n//2+1]
draw()
for i in board:
print(*i)
print(*ans)
반응형
'알고리즘 연습 > 구현, 문자열' 카테고리의 다른 글
[🥈5 / 백준 15904 / 파이썬] UCPC는 무엇의 약자일까? (0) | 2022.03.18 |
---|---|
[🥉3 / 백준 2754 / 파이썬] 학점계산 (0) | 2022.03.15 |
[🥉1 / 백준 11383 / 파이썬] 뚊 (0) | 2022.03.13 |
[🥉1 / 백준 11557 / 파이썬] Yangjojang of The Year (0) | 2022.03.07 |
[🥉2 / 백준 10102 / 파이썬] 개표 (0) | 2022.03.01 |