문제
달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.
다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.
[예제]
N이 3일 경우,
N이 4일 경우,
[제약사항]
달팽이의 크기 N은 1 이상 10 이하의 정수이다. (1 ≤ N ≤ 10)
[입력]
가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.
각 테스트 케이스에는 N이 주어진다.
[출력]
각 줄은 '#t'로 시작하고, 다음 줄부터 빈칸을 사이에 두고 달팽이 숫자를 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
문제 풀이
나선형 순회 알고리즘은 사전에 이미 여기에서 다룬 적이 있다.
링크의 레퍼런스 코드에서 작성한 대로 right, down, left, up 각 방향별 인덱스 좌표 이동을 배열에 저장 후 활용하는 방식으로 구현했다.
링크에서는 나선형 순회를 하며 배열의 값을 읽어야했다면, 이번 문제에서는 나선형 순회를 하며 순회 순서대로 숫자 값을 1부터 행렬 크기까지 넣어줘야한다. 따라서 기존 코드와 크게 달라지는 부분은 없다.
작성 코드 (Python)
def isValid(row, col):
if (row >= 0 and row < n and col >= 0 and col < n):
return True
else:
return False
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
n = int(input())
snail = [[0]*n for _ in range(n)]
# rd: row of direction, cd: column of direction
# right, down, left, up
rd = [0, 1, 0, -1]
cd = [1, 0, -1, 0]
# cr: current row, cc: current column
cr, cc = 0, -1
direction = 0 # 0:right, 1:down, 2:left, 3:up
i = 1
while (i <= n*n):
cr += rd[direction]
cc += cd[direction]
while(isValid(cr, cc) and snail[cr][cc] == 0):
snail[cr][cc] = i
cr += rd[direction]
cc += cd[direction]
i += 1
# 범위를 벗어났으므로 진행된 방향 반대로 한칸 이동(이동하기 전으로 다시 돌아감)
cr -= rd[direction]
cc -= cd[direction]
# 다음 방향으로 넘어가는데, 우-하-좌-상 4가지 방향으로 반복해서 순환되므로 % 연산 사용
direction = (direction + 1) % 4
print(f'#{test_case}')
for row in snail:
print(*row) # *붙이면 [] 없이 출력
파이썬으로 작성한 이유
코딩테스트 언어로 c++과 파이썬 사이에서 고민이 많았다.
어떤 언어를 선택할지 결정하기 위해 한동안 알고리즘 문제풀이를 할 때마다 c++, 파이썬 둘 다 사용해봤다.
비교 결과, 나는 파이썬을 선택하기로 했다. 그 이유는 다음과 같다.
- 문자열을 다룰때 파이썬의 이점이 정말 크다
- 작성해야하는 코드의 길이가 c++에 비해 월등히 짧고 간결하다
- 파이썬은 러닝커브가 짧은 언어이다. 현재 c++이 더 익숙하다곤 하나, STL 공부가 더 필요한 상태였다. 이러나 저러나 투자해야할 시간은 비등비등해보였다
- 예전과 달리 파이썬으로 코테를 볼 수 있는 기업이 많아졌다
물론 속도면에서는 c++이 정말 빠르다. 실행속도가 비교가 안 될 정도로 빠르다. 그래서 똑같이 최적화되지 않은 코드를 작성했더라도 c++은 실행시간 초과 오류가 날 일이 파이썬보다 적다. 분명 매력적인 일이지만, 그럼에도 불구하고 파이썬의 이점이 더 크게 다가왔다.
따라서 앞으로는 코딩테스트에 필요한 파이썬 문법들을 빠르게 공부한 뒤, c++은 뒤로 미루고 파이썬으로만 코테 준비를 하려고 한다.
'Problem Solving' 카테고리의 다른 글
[JS 알고리즘] Toy 3 - isSubsetOf (0) | 2022.05.16 |
---|---|
[SWEA] D2 - 1926. 간단한 369게임 in 파이썬 (0) | 2022.05.16 |
[JS 알고리즘] Toy 23 - spiralTraversal (0) | 2022.05.13 |
[JS 알고리즘] Toy 2 - fibonacci ( O(n) ) (0) | 2022.05.12 |
[JS 알고리즘] Toy 1 - orderOfPresentation (0) | 2022.05.12 |