728x90
*문제 출처는 프로그래머스에 있습니다.
문제 제목: 삼각 달팽이
문제 사이트: https://school.programmers.co.kr/learn/courses/30/lessons/68645
코드를 통해 직사각형의 삼각형을 만든다.
나머지 부분은 0으로 채워준다
arr = [[0 for _ in range(n)] for i in range(n)]
여기서 화살표 방향은 세가지
1. 아래로 내려가는 방향
2. 옆으로 가는 방향
3. 대각선으로 올라가는 방향
row = -1 # 행 (내려가면서 해당 인덱스에 값 추가)
col = 0 # 열
cnt = 0 # 숫자
기본 변수를 정해준다.
인덱스들을 지나가면서 값을 추가해줄 것이다.
먼저 첫번째로 아래로 지나가는 경우
# 아래 방향
for i in range(n):
row += 1
if arr[row][col] == 0 and row < n: # 만약 숫자가 안채워져있으면
arr[row][col] += cnt + 1
cnt += 1
else: # 만약 숫자가 채워져있으면 마지막 자리로 가서 for문을 빠져 나옴
row -= 1
break
오른쪽 방향으로 지나가는 경우
# 오른쪽 방향
for i in range(n-1):
col += 1
if arr[row][col] == 0 :
arr[row][col] += cnt + 1
cnt += 1
else:
col -= 1
break
대각선 방향으로 올라가는 경우
# 대각선 방향
for i in range(n-2):
col -= 1
row -= 1
if arr[row][col] == 0: # 만약 숫자가 안채워져있으면
arr[row][col] += cnt + 1
cnt += 1
else:
col += 1
row += 1
break
이 과정을 반복해주면 된다.
while cnt != target:
# 아래 방향
for i in range(n):
row += 1
if arr[row][col] == 0 and row < n: # 만약 숫자가 안채워져있으면
arr[row][col] += cnt + 1
cnt += 1
else: # 만약 숫자가 채워져있으면 마지막 자리로 가서 for문을 빠져 나옴
row -= 1
break
print(arr)
# 오른쪽 방향
for i in range(n-1):
col += 1
if arr[row][col] == 0 :
arr[row][col] += cnt + 1
cnt += 1
else:
col -= 1
break
print(arr)
# 대각선 방향
for i in range(n-2):
col -= 1
row -= 1
if arr[row][col] == 0: # 만약 숫자가 안채워져있으면
arr[row][col] += cnt + 1
cnt += 1
else:
col += 1
row += 1
break
print(arr)
여기서 target 값을 조건문으로 잡아주었는데,
해당 직삼각형의 크기만큼 모두 지나갔을 시 while 문을 빠져나간다.
target = (n*(n+1)) // 2
이렇게 완성된 코드에서 마지막으로 삼각형을 펴서 출력하면 된다.
# 삼각형 펴서 출력하기
answer = []
for i in arr:
for j in i:
if j != 0:
answer.append(j)
나의 풀이
def solution(n):
arr = [[0 for _ in range(n)] for i in range(n)]
row = -1 # 행 (내려가면서 해당 인덱스에 값 추가)
col = 0 # 열
cnt = 0 # 숫자
target = (n*(n+1)) // 2
while cnt != target:
# 아래 방향
for i in range(n):
row += 1
if arr[row][col] == 0 and row < n: # 만약 숫자가 안채워져있으면
arr[row][col] += cnt + 1
cnt += 1
else: # 만약 숫자가 채워져있으면 마지막 자리로 가서 for문을 빠져 나옴
row -= 1
break
# 오른쪽 방향
for i in range(n-1):
col += 1
if arr[row][col] == 0 :
arr[row][col] += cnt + 1
cnt += 1
else:
col -= 1
break
# 대각선 방향
for i in range(n-2):
col -= 1
row -= 1
if arr[row][col] == 0: # 만약 숫자가 안채워져있으면
arr[row][col] += cnt + 1
cnt += 1
else:
col += 1
row += 1
break
# 삼각형 펴서 출력하기
answer = []
for i in arr:
for j in i:
if j != 0:
answer.append(j)
return answer
모범답안
def solution(n):
dx=[0,1,-1];dy=[1,0,-1]
b=[[0]*i for i in range(1,n+1)]
x,y=0,0;num=1;d=0
while num<=(n+1)*n//2:
b[y][x]=num
ny=y+dy[d];nx=x+dx[d];num+=1
if 0<=ny<n and 0<=nx<=ny and b[ny][nx]==0:y,x=ny,nx
else:d=(d+1)%3;y+=dy[d];x+=dx[d]
return sum(b,[])
그래프 탐색을 이용해서 섹시하게 문제를 푼 것 같다.. 멋있다
728x90
'coding test - python > Programmers' 카테고리의 다른 글
Programmers / 메뉴 리뉴얼 / Python 파이썬 (0) | 2022.09.02 |
---|---|
Programmers / N- Queens / Python 파이썬 (0) | 2022.09.02 |
Programmers / [1차] 뉴스 클러스터링 / Python 파이썬 (0) | 2022.08.24 |
Programmers / 영어 끝말잇기 / Python 파이썬 (0) | 2022.08.24 |
Programmers / [1차] 캐시 / Python 파이썬 (0) | 2022.08.24 |