상세 컨텐츠

본문 제목

[프로그래머스]삼각달팽이(파이썬)

알고리즘 공부

by Tabris4547 2022. 3. 4. 17:52

본문

728x90

https://programmers.co.kr/learn/courses/30/lessons/68645?language=python3 

 

코딩테스트 연습 - 삼각 달팽이

5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

programmers.co.kr

삼각달팽이 문제.

피라미드 쌓는 느낌으로 풀어보면

문제 풀이방법을 어느정도 유추할 수 있습니다.

여기서 어려웠던 부분은

아래로 가는 것

옆으로 가는 것

위로 가는 것

이 세 가지를 어떻게 구현할 것인가입니다.

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를 해도 좋을 것 같습니다.

728x90

관련글 더보기

댓글 영역