*문제 출처는 백준에 있습니다.
문제 제목: 달팽이 / 1913번 (실버 3단계)
문제 사이트: https://www.acmicpc.net/problem/1913
문제 설명
나의 풀이
# 정수를 입력 받는다.
n = int(input())
fine_target = int(input())
# 돌아갈 수 있는 길이
max_turn = 1
# 돌아가는 현재 턴
current_turn = 0
# 달팽이 배열
snail = [[0] * n for _ in range(n)]
# 컬럼 행렬
row = n // 2
column = n // 2
# 값을 넣을 배열
count = 1
# 좌표를 저장할 배열
result = []
# 0일때는 위 / 1일때는 오른쪽 / 2일때는 아래 / 3일때는 왼쪽
direction = 0
# 초기 값은 직접 넣어주고 시작
snail[row][column] = count
while count != (n * n):
if current_turn == 2:
max_turn += 1
current_turn = 0
# 위로 가야함
if direction == 0:
for _ in range(max_turn):
row -= 1 # 위로 이동
if row < 0 or row >= n: # 범위를 벗어난 경우 처리
break
count += 1
snail[row][column] = count
if count == fine_target:
result = [row, column]
direction = 1
# 오른쪽으로 가야함
elif direction == 1:
for _ in range(max_turn):
column += 1 # 오른쪽으로 이동
if column < 0 or column >= n:
break
count += 1
snail[row][column] = count
if count == fine_target:
result = [row, column]
direction = 2
# 아래로 가야함
elif direction == 2:
for _ in range(max_turn):
row += 1 # 아래로 이동
if row < 0 or row >= n:
break
count += 1
snail[row][column] = count
if count == fine_target:
result = [row, column]
direction = 3
# 왼쪽으로 가야함
elif direction == 3:
for _ in range(max_turn):
column -= 1 # 왼쪽으로 이동
if column < 0 or column >= n:
break
count += 1
snail[row][column] = count
if count == fine_target:
result = [row, column]
direction = 0
current_turn += 1
for i in snail:
for j in i:
print(j, end = ' ')
print()
print(result[0] + 1, result[1] + 1)
처음에는 위 방식을 이용해서 풀었지만 인덱스 에러가 계속 발생해서 다른 풀이 방법을 고안해야만 했다. 아직까지도 왜 인덱스 에러가 발생하는 지 모르겠다.
n = int(input())
m = int(input())
snail = [[0]*n for _ in range(n)]
x = (n - 1) // 2
y = (n - 1) // 2
snail[x][y] = 1
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
i = 2
start = 3
while x != 0 or y != 0:
while i <= start * start:
if x == y == (n - 1) // 2:
cnt_up, cnt_down, cnt_left, cnt_right = start, start - 1, start - 1, start - 2
x += dx[0]
y += dy[0]
cnt_up -= 1
elif cnt_right > 0: # 우
x += dx[3]
y += dy[3]
cnt_right -= 1
elif cnt_down > 0: # 하
x += dx[1]
y += dy[1]
cnt_down -= 1
elif cnt_left > 0: # 좌
x += dx[2]
y += dy[2]
cnt_left -= 1
elif cnt_up > 0: # 상
x += dx[0]
y += dy[0]
cnt_up -= 1
snail[x][y] = i
i += 1
n -= 2
start += 2
for j in range(len(snail)):
print(*snail[j])
if m in snail[j]:
mx = j + 1
my = snail[j].index(m) + 1
print(mx, my)
차이점은 다음과 같다.
- 배열 채우는 방식: 정답 코드는 방향별로 이동 횟수를 추적하는 방식으로 배열을 채우고, 내 코드에서는 단순히 방향을 따라가며 배열을 채웁니다.
- 위치 계산: 정답 코드에서는 cnt_up, cnt_down, cnt_left, cnt_right로 각 방향의 남은 칸 수를 추적하여 이동 횟수를 처리합니다. 내 코드에서는 current_turn과 max_turn을 이용해 이동 횟수를 처리합니다.
- 출력 방식: 두 코드 모두 m을 찾을 때 좌표를 출력하지만, 정답 코드는 배열을 출력한 뒤 m의 위치를 찾고, 내 코드는 배열을 채우는 과정 중에 바로 좌표를 추적합니다.
※ 알아야 할 것
https://shoark7.github.io/programming/algorithm/rotate-2d-array
'코딩테스트(프로그래머스 & 백준) > 백준-Python' 카테고리의 다른 글
백준 / 농장 관리 / 1245번 / Python (1) | 2024.11.14 |
---|---|
백준 / 시간 관리 / 1263번 / Python (2) | 2024.11.13 |
백준 / 카드2 / 2164번 / Python (0) | 2024.11.04 |
백준 / 보물 / 1026번 / Python (0) | 2024.10.31 |
백준 / 수들의 합 / 1789번 / Python (0) | 2024.10.22 |