문제
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
풀이
숫자는 1부터 (N*N)번까지 1씩 증가하며 입력되고 우, 하, 좌, 상 순서로 벽이나 이미 작성된 숫자를 만나면 방향을 이동하는것에 주의하면서 로직을 작성하면 된다.
우선 달팽이 숫자들을 저장할 N*N 리스트를 0으로 초기화 해놓는다.
move = [[0, 1], [1, 0], [0, -1], [-1, 0]] # 우, 하, 좌, 상
move에 각 방향별 더해줄 y, x값을 미리 리스트로 선언한 다음
현재 방향의 값을 더한 새로운 newX, newY값을 구한 뒤,
벽이나 이미 작성된 숫자와 만났다면 방향을 틀어준다.
(방향 인덱스에 1씩 더한뒤 나머지 연산을 통해 0,1,2,3가 계속 전환되도록 구현하였다)
if newX < 0 or newX >= N or newY < 0 or newY >= N:
direction += 1
continue
if snail[newY][newX] != 0:
direction += 1
continue
1부터 N*N까지 달팽이 숫자가 입력되었으면 반복문을 빠져나가고 달팽이 숫자들을 출력해준다.
정답 코드
T = int(input())
for i in range(T):
print(f"#{i+1}")
N = int(input())
snail = [[0]*N for _ in range(N) ]
y, x = 0, 0
snail[y][x] = 1
move = [[0, 1], [1, 0], [0, -1], [-1, 0]] # 우, 하, 좌, 상
direction = 0
number = 1
while number < N*N:
newY = y + move[direction % 4][0]
newX = x + move[direction % 4][1]
if newX < 0 or newX >= N or newY < 0 or newY >= N:
direction += 1
continue
if snail[newY][newX] != 0:
direction += 1
continue
number += 1
snail[newY][newX] = number
y = newY
x = newX
for i in range(N):
print(*snail[i])
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA/Python] 1215번. [S/W 문제해결 기본] 3일차 - 회문1 (D3) (0) | 2024.11.14 |
---|---|
[SWEA/Python] 1289번. 원재의 메모리 복구하기 (D3) (0) | 2024.11.13 |
[SWEA/Python] 21425번. += (D2) (0) | 2024.11.12 |