728x90
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
< 📝 문제 >
달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.
다음과 같이 정수 N을 입력받아 N크기의 달팽이를 출력하시오.
[예제]
N이 3일 경우,
![](https://blog.kakaocdn.net/dn/CKOsA/btrtIj59bzD/OGuDII55mfvHxZoAkSRyG1/img.png)
N이 4일 경우,
![](https://blog.kakaocdn.net/dn/RKwgL/btrtQppEY0k/6udck4LsKW8q036FYTu3h0/img.png)
< ❓ 생각 >
이동방향 우 -> 하 -> 좌 -> 상 반복
정상 범위이면 숫자 할당
정삼 범위가 아니면(indexError) 이전으로 돌리고 이동방향을 바꿔서 정상 범위로 돌리기
N*N이 할당될 때까지 반복
< 💻 코드 >
# 테스트 케이스 개수
T = int(input())
for tc in range(1,T+1):
# N크기의 달팽이
N = int(input())
# N*N 크기 판
result = [[0]*N for _ in range(N)]
# 이동방향 우,하,좌,상
dr = [0,1,0,-1]
dc = [1,0,-1,0]
# 다음 칸으로 이동하기 위한 방향을 나타내는 변수
# 0: 우, 1: 하, 2: 좌, 3: 상
dir =0 # 최초는 오른쪽으로 이동
r, c = 0, 0 # 현재 위치
num = 1
# N*N 행렬에 1부터 N*N 까지 정수를 하나씩 넣기
# 숫자를 행렬에 다 넣을 때 까지 계속 반복
# 이동하고, 숫자 넣기
while num <= N*N:
# 정상 범위이고 다른 숫자가 없으면, 숫자할당
if (0 <= r < N and 0 <= c < N) and result[r][c] == 0:
result[r][c] = num
num += 1
# 정상 범위가 아니면 이동방향 바꾸기, 정상범위 안으로 돌리기
else:
# 이전으로 이동
r -= dr[dir]
c -= dc[dir]
# 방향 바꾸기
dir = (dir + 1) % 4
# 다음으로 이동
r += dr[dir]
c += dc[dir]
print(f'#{tc}')
for row in result:
print(*row)
728x90
반응형
'TIL - 프로그래밍 > Python 알고리즘' 카테고리의 다른 글
[SWEA] 4864. 문자열 비교 - Python (0) | 2022.02.20 |
---|---|
[SWEA] 1221. GNS - Python (0) | 2022.02.20 |
[SWEA] 1210. Ladder1 - Python (0) | 2022.02.20 |
[SWEA] 4843. 특별한 정렬 - Python (0) | 2022.02.20 |
[SWEA] 4839. 이진탐색 - Python (0) | 2022.02.20 |
댓글