https://programmers.co.kr/learn/courses/30/lessons/68645?language=python3
삼각달팽이 문제.
피라미드 쌓는 느낌으로 풀어보면
문제 풀이방법을 어느정도 유추할 수 있습니다.
여기서 어려웠던 부분은
아래로 가는 것
옆으로 가는 것
위로 가는 것
이 세 가지를 어떻게 구현할 것인가입니다.
n=5일 때의 삼각달팽입니다.
대략 저런식으로 그려집니다.
저는 먼저
삼각달팽이를 넣을 리스트를
초기화해줬습니다.
층마다 층의 갯수만큼 리스트가 있으므로
다음과 같이 초기화를 해줍니다.
아래로 내려가는 경우입니다.
내려가다가 막히거나 숫자가 있으면
방향을 틀어야합니다.
그리고 다음 방향인
왼쪽으로 이동해야합니다.
왼쪽으로 이동은 rol+1입니다.
옆으로 가는 것도 비슷합니다.
옆으로 잘 가다가
막다른 길에 다 다르거나
숫자가 있으면
위로 올라갑니다.
위로 올라가는 건
rol-1 col-1입니다.
이제 올라갑니다.
올라가는 건 col과 rol
각각을 -1해주는 것과 같습니다.
그러다 막다른 길or 숫자가 있는 곳을 만나면
아래로 내려갑니다.
아래로 내려가는 건 col-1
def solution(n):
answer = []
trees = [[0] * (i + 1) for i in range(n)] # 트리를 만들어줌.
num = 0
for i in range(1, n + 1):
num += i
size = 1
col, rol = 0, 0
while num >= size:
# 아래로 가는 경우
while num >= size:
if col < n and trees[col][rol] == 0:
trees[col][rol] = size
col += 1
size += 1
else:
col -= 1
rol += 1
break
# 옆으로 가는 경우
while num >= size:
if rol < n and trees[col][rol] == 0:
trees[col][rol] = size
rol += 1
size += 1
else:
rol -= 2
col -= 1
break
# 위로 가는 경우
while num >= size:
if (rol >= 0 and col >= 0) and trees[col][rol] == 0:
trees[col][rol] = size
col -= 1
rol -= 1
size += 1
else:
rol += 1
col += 2
break
for x in range(n):
for y in range(x + 1):
answer.append(trees[x][y])
return answer
여기서 주의할 점은
아래 위 옆 중
어떤 경우에도 최종숫자까지가면
정지해야된다는 것입니다.
저는 각각에 대해서
while문을 걸어주면서
이를 해결했습니다.
편하신 대로, if문을 넣어서
최종 숫자에 가면
break를 해도 좋을 것 같습니다.
[백준14890번] 경사로(파이썬) (0) | 2022.03.06 |
---|---|
[백준 14888번] 연산자 끼워넣기 (0) | 2022.03.06 |
[프로그래머스]프린터(파이썬) (0) | 2022.03.03 |
[백준 15685번] 드래곤 커브 (1) | 2022.02.28 |
[백준 23288번] 주사위 굴리기2(파이썬) (0) | 2022.02.23 |
댓글 영역