728x90
반응형
문제: https://www.acmicpc.net/problem/1913
해당 문제를 풀이할 때 아래 링크의 유투브 강의를 참고했습니다.
큰 도움이 되므로 시청을 왕 - 추천합니다 !
https://www.youtube.com/watch?v=rw2gQg9x_EA
문제 풀이 방법은 두 가지 방식이 있습니다.
1. 1부터 채우기
2. 49(n*n)부터 채우기
저는 2번 방법으로 문제를 해결했습니다.
풀이
풀이 방법을 안다면 코드 구현은 그렇게 어렵지 않습니다.
하지만 자꾸만
시작 지점(arr[0][0])에서 오류가 났는데요.
이는 while문 안의 ni = i + di[dr], nj = j + dj[dr]에서
arr[0][0]을 채우기도 전에 좌표를 dr만큼 이동시키기 때문입니다.
따라서 저는 arr[0][0]은 n*n으로 채워놓고,
cnt을 n*n-1~1(48부터 1까지)로 설정하여 arr[i][j]를 채우는 방향으로 문제를 풀었습니다.
n = int(input())
num = int(input())
arr = [[0]*n for _ in range(n)]
# 상하좌우 순서 (x, y랑 헷갈리면 안됨 !)
di = [1, 0, -1, 0]
dj = [0, 1, 0, -1]
i, j, dr = 0, 0, 0 # 하우상좌
cnt = n*n-1
while cnt != 0:
# 다음 위치 = 현재 위치 + 움직일 방향
if i ==0 and j==0:
arr[i][j] = n*n
ni, nj = i + di[dr], j + dj[dr] # 시작부터 한 칸 가고 있음
# 범위내에 있고, 방문한 적이 없는 경우
if 0<=ni<n and 0<=nj<n and arr[ni][nj]==0:
i, j = ni, nj
arr[i][j] = cnt
cnt -= 1
else: # 범위 밖에 있을 때 -> 방향을 바꿔줌
dr = (dr+1)%4
result=[]
for i in range(n):
for j in range(n):
print(arr[i][j], end=' ')
if j == n-1:
print()
if arr[i][j] == num:
result = [i+1, j+1]
print(*result)
728x90
'자료구조 및 알고리즘 > 백준' 카테고리의 다른 글
[python] 10870. 피보나치 수 5 (0) | 2024.06.01 |
---|---|
[python] 5618. 공약수 (0) | 2024.05.31 |
[python] 1244. 스위치 켜고 끄기 (1) | 2024.05.29 |
[python] 2960. 에라토스테네스의 체 (0) | 2024.05.28 |
[python] 17478. 재귀함수가 뭔가요 ? (0) | 2024.05.28 |