본문 바로가기

그 땐 Algorithm했지/그 땐 Programmers했지

[Self-study/level2] Python | 삼각 달팽이

728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/68645

 

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

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

 

1차 풀이


def firstStep(list, num, x, y, counting):
    for i in range(counting):
        list[x][y] = num
        x += 1
        num += 1
    return (num, x - 1, y + 1)

def secondStep(list, num, x, y, counting):
    for i in range(counting):
        list[x][y] = num
        y += 1
        num += 1
    return (num, x - 1, y- 2)

def thirdStep(list, num, x, y, counting):
    for i in range(counting):
        list[x][y] = num
        x -= 1
        y -= 1
        num += 1
    return (num, x + 2, y + 1)

def solution(n):
    triangle = []
    for i in range(1, n + 1):
        triangle.append([0] * i)

    x, y = 0, 0
    num = 1
    counting = len(triangle)
    step = 1

    while counting:
        if step == 1:
            num, x, y = firstStep(triangle, num, x, y, counting)
            counting -= 1
            step = 2
        elif step == 2:
            num, x, y = secondStep(triangle, num, x, y, counting)
            counting -= 1
            step = 3
        else:
            num, x, y = thirdStep(triangle, num, x, y, counting)
            counting -= 1
            step = 1

    answer = []
    for i in triangle:
        answer.extend(i)

    return answer

👉🏻일단 전체 코드이다! 하나씩 살펴보기 전에 그림으로 이해해보자ㅎ

👉🏻먼저 이중 리스트 triangle을 만든다.

  • N이 4라면 0이 1개인 리스트, 2개인 리스트, 3개인 리스트, 4개인 리스트 이런 식으로 총 4개를 만들어 넣는다.

👉🏻이중 리스트를 삼각형이라고 생각하고 숫자를 채우는 과정을 생각해보자.

  • counting은 숫자를 채우는 횟수(칸 수)이다. N이 4라면 처음에는 N번만큼 채우고 이후 채우는 횟수가 한 칸씩 줄어든다. (4 → 3 → 2 → 1)
  • 처음에는 아래 방향으로 칸을 채우고 두 번째는 오른쪽, 세 번째는 위쪽 방향으로 칸을 채운다. 이 3가지 step이 반복된다.

  • triangle리스트를 좌표라고 생각한다면 각 리스트들을 x, 리스트 안의 요소들을 y라고 생각할 수 있다.
    • 그렇다면 first step(아래로 칸을 채울 때)때는 y값은 그대로 있고 x값이 1씩 증가하며 이동하면서 값을 채운다.
    • second step(오른쪽으로 칸을 채울 때)때는 x값이 그대로 있고 y값이 1씩 증가하며 이동하면서 값을 채운다.
    • third step(위로 칸ㅇ르 채울 때)때는 x, y값 둘 다 1씩 줄어들며 이동하면서 값을 채운다.

👉🏻최종적으로 이런 상태가 되도록 만들어보장!

def solution(n):
    triangle = []
    for i in range(1, n + 1):
        triangle.append([0] * i)

    x, y = 0, 0
    num = 1
    counting = len(triangle)
    step = 1

    while counting:
        if step == 1:
            num, x, y = firstStep(triangle, num, x, y, counting)
            counting -= 1
            step = 2
        elif step == 2:
            num, x, y = secondStep(triangle, num, x, y, counting)
            counting -= 1
            step = 3
        else:
            num, x, y = thirdStep(triangle, num, x, y, counting)
            counting -= 1
            step = 1

    answer = []
    for i in triangle:
        answer.extend(i)

    return answer

👉🏻먼저 solution 함수이다.

  • triangle함수에 n의 개수만큼 0을 담은 리스트들을 넣어준다.
  • x, y는 좌표이고 num은 좌표에 넣어줄 숫자(삼각형을 채울 숫자)이고 counting은 숫자를 채울 횟수(1씩 줄어든다.)이고 step은 현재 진행 단계(단계마다 아래, 오른쪽, 위 방향으로 움직인다)이다.
  • counting이 0이 될 때까지 while 문을 돌린다.
    • 현재 step에 따라 각각 firstStep, SecondStep, ThirdStep 함수를 실행시킨다.
    • counting을 1씩 줄여주고 step을 다음 step으로  설정한다.
  • extend를 사용해서 triangle 속의 리스트들의 요소를 answer리스트에 담아 return한다.
def firstStep(list, num, x, y, counting):
    for i in range(counting):
        list[x][y] = num
        x += 1
        num += 1
    return (num, x - 1, y + 1)

def secondStep(list, num, x, y, counting):
    for i in range(counting):
        list[x][y] = num
        y += 1
        num += 1
    return (num, x - 1, y- 2)

def thirdStep(list, num, x, y, counting):
    for i in range(counting):
        list[x][y] = num
        x -= 1
        y -= 1
        num += 1
    return (num, x + 2, y + 1)

👉🏻fristStep과 secondStep과 thirdStep 함수이다!

  • 각 step에 맞게 num을 채워주고 좌표를 이동시킨다. num은 계속 1씩 증가시켜준다.
  • 다음 좌표에 넣을 num과 다음 좌표를 return해준다.
728x90