본문 바로가기
프로그래머스/Python

[프로그래머스] 삼각 달팽이 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 10. 22.
728x90
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

해당 문제는 달팽이가 채우기를 하는 변과 원소의 위치에 관한 규칙을 찾으면 된다.

달팽이가 이동하면서 해당 변에 채워야 할 원소의 개수를 저장하고 이를 하나씩 불러오면 값을 채운다.

모든 원소를 1로 지정하고 이전 값을 더하며 값을 바꾼다.

먼저 내려가는 변은 채워야 할 열 중 제일 왼쪽을 내려가면서 채우면 된다. (행 위치 증가, 열 위치 고정)

다음으로 옆으로 가는 변은 해당 행을 그대로 채우면 된다. (행 위치 고정, 열 위치 증가)

마지막으로 올라가는 변은 채워야 할 열 중 제일 오른쪽을 올라가면서 채우면 된다. (행 위치 감소, 열 위치 고정)

이를 해당 변의 순서(i)와 값을 채워야 할 횟수(count[i] = j)를 활용하여 규칙을 정하면 된다. (아래 코드 참고)

 

  1. 삼각형의 각 행별로 숫자를 저장할 리스트를 생성한다. li = list()
  2. 각 행은 행 번호만큼 열의 개수가 존재하므로 모든 열의 원소 값을 1로 한 리스트를 생성하여 추가한다. for i in range(1, n + 1): li.append(list(1 for _ in range(i)))
  3. 달팽이가 채우기를 할 때 한 변에 채워야 하는 원소의 개수를 리스트로 저장한다. count = list(i for i in range(n, 0, -1))
  4. 이전 값을 저장할 변수를 생성하고 초기화한다. pre = 0
  5. 달팽이가 채우기를 할 전체 변의 개수만큼 반복하며 for i in range(len(count))
  6. 만약 해당 차례가 가로로 이동하는 변이면 if (i % 3 == 1)
  7. 행의 위치는 고정이므로 행의 값을 저장한다. row = i // 3 + i % 3
  8. 해당 변에 채워야 하는 원소의 개수만큼 반복하며 for j in range(count[i])
  9. 해당 원소의 값에 이전 값을 더하고 li[-row][row + j] += pre
  10. 다음 연산을 위해 이전 값을 방금 변경한 원소의 결과로 저장한다. pre = li[-row][row + j]
  11. 만약 해당 차례가 위로 올라가는 변이면 elif (i % 3 == 2)
  12. 열의 위치는 고정이므로 열의 값을 저장한다. col = i // 3 + i % 3 - 1
  13. 해당 변에 채워야 하는 원소의 개수만큼 반복하며 for j in range(count[i])
  14. 해당 원소의 값에 이전 값을 더하고 li[-col - j - 1][-col] += pre
  15. 다음 연산을 위해 이전 값을 방금 변경한 원소의 결과로 저장한다. pre = li[-col - j - 1][-col]
  16. 만약 해당 차례가 아래로 내려가는 변이면 else
  17. 마찬가지로 열의 위치는 고정이므로 열의 값을 저장한다. col = i // 3
  18. 해당 변에 채워야 하는 원소의 개수만큼 반복하며 for j in range(count[i])
  19. 해당 원소의 값에 이전 값을 더하고 li[2 * col + j][col] += pre
  20. 다음 연산을 위해 이전 값을 방금 변경한 원소의 결과로 저장한다. pre = li[2 * col + j][col]
  21. 전체 리스트를 행별로 불러오고 for i in li
  22. 다시 열의 원소별로 불러오며 for j in i
  23. 각 원소를 순서대로 추가한다. answer.append(j)
반응형

3. 소스코드

def solution(n):
    answer = []
    
    li = list()
    for i in range(1, n + 1):
        li.append(list(1 for _ in range(i)))

    count = list(i for i in range(n, 0, -1))
    pre = 0

    for i in range(len(count)):
        if (i % 3 == 1):
            row = i // 3 + i % 3
            for j in range(count[i]):
                li[-row][row + j] += pre
                pre = li[-row][row + j]
        elif (i % 3 == 2):
            col = i // 3 + i % 3 - 1
            for j in range(count[i]):
                li[-col - j - 1][-col] += pre
                pre = li[-col - j - 1][-col]
        else:
            col = i // 3
            for j in range(count[i]):
                li[2 * col + j][col] += pre
                pre = li[2 * col + j][col]
    
    for i in li:
        for j in i:
            answer.append(j)
            
    return answer
728x90
반응형