드디어 기초 문제의 마지막 문제이다! ❤❤
정답률이 45%인 문제이다ㅠㅠ
그래도 한 번 풀어보자!
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/181832
내 코드
결국 못풀어서 도움을 받아 풀었다ㅠㅠ
넘 어려운 문제다ㅠㅠ
역시 정답률 45%.......
우울하담ㅠㅠ
def solution(n):
dy = [0,1,0,-1] # 오른,아래,왼,위
dx = [1,0,-1,0]
arr = [ [0 for x in range(n)] for _ in range(n)]
x=0
y=0
arr[y][x] = 1
cnt = 2
k=0
while cnt<=n*n:
while 1:
ny = y + dy[k]
nx = x + dx[k]
if ny<0 or ny >=n or nx<0 or nx >=n or arr[ny][nx]!=0:
break
y = ny
x = nx
arr[y][x]= cnt
cnt+=1
for i in arr:
print(i)
print('-------------')
k = (k+1) % 4
return arr
하나씩 파고 들어보자.
dy = [0,1,0,-1]
dx = [1,0,-1,0]
# 각각 x와 y가 어디로 이동하는지...
# 즉, (1, 0) -> 오른쪽, (0, 1) > 아래쪽, (-1, 0) -> 왼쪽, (0, -1) -> 위쪽
이제, dy와 dx는 어디로 움직일지를 나타내는 벡터가 된다.
이제 첫 시작은 0, 0으로 두자!
그렇게 되면 처음에 해당하는 위치는
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
빨갛게 표시한 곳이 된다!
이제 그 값을 1로 지정하고, 넣을 값(cnt)를 2로 지정한다.
이 때, k는 오, 아, 왼, 위 중 어디로 움직일지를 나타내는 값이다!
while문을 도는데..
while문의 조건은 채울 값이 n^2이 되면 끝나게 된다.
이 때, ny, nx는 어디로 움직일 것인지. 즉, 현재 값이 오른쪽으로 갈 것인지, 아래로 갈 것인지 등을 나타내며,
궁극적으로는 좌표값을 나타낸다.
만약, 좌표가 0보다 작거나 n의 값을 넘어가게 된다면 while문을 벗어나고,
만약 오->아 처럼 방향을 바꿀 때, 0이 아닌 값이 있다면 값을 채우는 것을 벗어나게 된다!
따라서 오른쪽 이동 -> 아래 이동 -> 왼쪽 이동 -> 위쪽 이동
을 하면서 값을 차례대로 채우며 나선형으로 값을 채우게 된다!
이 때, k는 어디로 이동할지 나타내는 값이라고 했는데, 오-> 아->왼->위를 차례대로 움직이므로
(k+1) % 4를 하며 순서대로 바꾸게 된다.
많이 복잡하고 너무 어려운 문제였다..
풀이를 까먹을 때쯤 다시 풀어볼 예정이다.
어렵지만 새로운 것을 알게되어서 좋다.
그래도 나중에는 잘 풀 수 있겠지.
끄읏-!
'코딩테스트 > PYTHON' 카테고리의 다른 글
[프로그래머스][PYTHON] Lv. 0 중앙값 구하기 (0) | 2024.02.22 |
---|---|
[프로그래머스][PYTHON] Lv. 0 분수의 덧셈 (0) | 2024.02.22 |
[프로그래머스][PYTHON] Lv. 0 그림 확대 (0) | 2024.02.18 |
[프로그래머스][PYTHON] Lv. 0 정사각형으로 만들기 (0) | 2024.02.18 |
[프로그래머스][PYTHON] Lv. 0 날짜 비교하기 (0) | 2024.02.17 |