2025. 2. 18. 09:07ㆍ프로그래머스/LV.0
문제링크: 정수를 나선형으로 배치하기
문제설명
양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
제한조건
- 1 ≤ n ≤ 30
문제풀이
def solution(num):
if num==1:
return [[1]]
answer = [[0 for _ in range(num)] for _ in range(num)]
x,y=0,0
dir='r'
for n in range(1,num**2+1):
answer[x][y]=n
if dir=='r':
y+=1
if y==num-1 or answer[x][y+1] != 0:
dir='d'
elif dir == 'd':
x+=1
if x==num-1 or answer[x+1][y] != 0:
dir='l'
elif dir == 'l':
y-=1
if y==0 or answer[x][y-1] != 0:
dir='u'
elif dir=='u':
x-=1
if answer[x-1][y] !=0:
dir='r'
return answer
예전에 여러가지 참고하면서 풀었던 풀이....
그때 정리했던 노션을 보면
if num==1:
return [[1]]
이걸 안써줘서 통과가 안됐다고 써있음.
수학에서 n=1 일때를 신경써줘야 하는 건 국룰인것같다.
다시 풀어도 예전에 풀던 풀이만 기억에 남아서 비슷하게 풀었다.. 심지어 for문에서 범위값을 (n**2+1)을 안하고 (n+1)만 해서 틀림...
n*n 리스트를 0으로 초기화 해준다.
빙글빙글 리스트를 돌기때문에 맨 끝이거나 다음 행선지가 0이 아니면 방향을 바꾸어 준다.
혹시 몰라 n이 1일때의 코드를 주석처리하고 실행해보니 13번 하나만 에러가 난다. 아마 n이 1일때의 경우인 거겠지?
n이 1 일때를 안써주면 인덱스 에러가 난다.
그리고 이걸 보니 다른 조건문에서도 인덱스 에러가 날 수 있는 거 아닌가? 하고
if y==n-1 or answer[x][y+1]!=0:
를
if answer[x][y+1]!=0 or y==n-1:
로 바꾸어 써봤다
이렇게 쓰니 에러가 났다. or 뒷 조건에서 인덱스에러가 나기 전에 앞에서 조건이 맞아서 뒤에 조건을 실행을 안해서 인덱스 에러가 안나는 것 같다.
나의코드
def solution(n):
if n==1:
return [[1]]
answer = [ [0]*n for _ in range(n)]
temp='right'
x,y=0,0
for num in range(1,n**2 +1):
answer[x][y]=num
if temp=='right':
y+=1
if y==n-1 or answer[x][y+1]!=0:
temp='down'
elif temp=='down':
x+=1
if x==n-1 or answer[x+1][y]!=0:
temp='left'
elif temp=='left':
y-=1
if y==0 or answer[x][y-1]!=0:
temp='up'
elif temp=='up':
x-=1
if x==0 or answer[x-1][y]!=0:
temp='right'
return answer
참고하기
def solution(n):
answer = [[0]* n for _ in range(n)]
##시계방향나선형 : 우 하 좌 상 방향으로
dx= [0, 1, 0, -1] # 행
dy= [1, 0, -1, 0] # 열
x,y = 0,0 # 행, 열 인덱스. 시작점 초기화
move= 0 # 방향 인덱스: move=0일때 dx[0], d[0] 으로 오른쪽 방향이라는 뜻
for i in range(1, n*n +1):
answer[x][y] = i # 현재 위치에 해당 숫자 배치
nx= x+ dx[move]
ny= y+ dy[move]
# 다음 위치(nx, ny)가 그리드 안에 있고 아직 숫자가 안채워졌으면 다음위치로 이동
if 0 <= nx < n and 0 <= ny < n and answer[nx][ny] == 0:
x = nx
y = ny
else: # 다음 위치 그리드 밖으로 나가거나 숫자 이미 있으면 방향을 바꿔서 다음 위치 지정
move = (move + 1) % 4
x= x + dx[move]
y= y + dy[move]
return answer
def solution(n):
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
y, x = 0, -1
arr = [[0] * n for _ in range(n)]
cnt = 1
direction = 0
while cnt <= n**2:
ny, nx = y + dy[direction], x + dx[direction]
if 0 <= ny < n and 0 <= nx < n and not arr[ny][nx]:
arr[ny][nx] = cnt
cnt += 1
y, x = ny, nx
else:
direction = (direction + 1) % 4
return arr
def solution(n):
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
y, x = 0, -1
arr = [[0] * n for _ in range(n)]
cnt = 1
direction = 0
while cnt <= n**2:
ny, nx = y + dy[direction], x + dx[direction]
if 0 <= ny < n and 0 <= nx < n and not arr[ny][nx]:
arr[ny][nx] = cnt
cnt += 1
y, x = ny, nx
else:
direction = (direction + 1) % 4
return arr
x와 y의 방향설정을 각각 리스트로 따로 구현.
=> (1,0) (0,1) (-1,0) (0,-1) 이렇게 4방향으로만 움직이는데 이걸 x좌표와 y좌표를 따로 리스트로 만들어서 구현함.
그리고 조건에 맞으면 값을 넣고 조건에 틀리면 방향을 바꾼다.
if문을 더 적게 쓰고 코드도 더 간결하게 가능.
'프로그래머스 > LV.0' 카테고리의 다른 글
[프로그래머스][LV.0] 저주의 숫자 3 | python3 (0) | 2025.02.10 |
---|---|
[프로그래머스][LV.0] 유한소수 판별하기 | python3 (0) | 2025.02.10 |
[프로그래머스][LV.0] 최빈값 구하기 | python3 (0) | 2025.02.10 |
[프로그래머스][LV.0] 문자열 여러 번 뒤집기 | python3 (0) | 2025.02.03 |
[프로그래머스][LV.0] 주사위 게임 3 | python3 (0) | 2025.02.03 |