관리 메뉴

커리까지

[프로그래머스] 삼각 달팽이 파이썬 본문

알고리즘/풀이

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

목표는 커리 2022. 12. 4. 22:46
728x90
SMALL

문제 설명

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.

examples.png


제한사항
  • n은 1 이상 1,000 이하입니다.

입출력 예
n result
4 [1,2,9,3,10,8,4,5,6,7]
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]

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • 문제 예시와 같습니다.

제출 답안

from itertools import chain

# 1 ~ n +1까지의 총 합
def n_sum(n):
    result = 1
    for i in range(1, n+1):
        result += i
    return result

def solution(n):
    answer = [[0] * i for i in range(1, n + 1)] # 값을 담을 리스트
    num , row, col= 1, 0, 0 # 각 칸에 들어갈 값, 행, 열
    last_number = n_sum(n) # 마지막 숫자
    reverse = False # 거꾸로 올라갈지 확인하기
    while num < last_number:
        # 만약 row에 해당하는 리스트 안에 0이 없다면 그 행은 모두 처리된 것이니 넘어가기
        # reverse를 False하는 이유는 위에서 리버스에서 다시 순서대로 내려가기 위함을 표시
        if 0 not in answer[row]:
            reverse = False
            continue
        # 0이 있다면 해당 row, col에 num을 대입
        answer[row][col] = num
        # num 1 증가
        num += 1
        # 다시 해당 row가 모두 완료됐는지 확인하고 reverse를 False로 
        if 0 not in answer[row]:
            reverse = False
        # 지금 있는 row가 마지막 row면 순서대로 오른쪽으로 값을 증가시켜서 대입하여야 하기에
        if row == (n-1) and not reverse:
            # row의 모든 값이 계산 전이라면
            # 열만 옮기기
            if 0 in answer[row]:
                col += 1
                continue
            # 모두 완료됐으면 반대로 올라가야 하니 reverse True
            else:
                reverse = True
                n -= 1
        # reverse는 거꾸로 위로 올라가야 하니 행과 열 각각 -1
        if reverse:
            row -= 1
            col -= 1
        # reverse가 아니면 행만 증기시키기
        else:
            row +=1
    # 이중 리스트여서 chain으로 단일 리스트로 만들고 return
    return list(chain(*answer))
728x90
LIST
Comments