삼각달팽이

Sirius·2025년 3월 27일
0

처음생각

  1. 리스트를 n개 만들고 거기다가 append 하자
  2. 문제 발생 파이썬의 리스트는 스택의 성질을 갖는다. 따라서 n=4의 경우
    [1], [2, 9], [3, 8], [4, 5, 6, 7]까지(한바퀴)는 잘 채워지지만 그 다음에
    [1], [2, 9], [3, 8, 10], [4, 5, 6, 7] 이렇게 채워지게 됨 -> 순서가 안맞는다.

두번째 든 생각

  1. 0으로 위치가 정해진 배열을 선언하자. (n+1) * (n+1)
  2. dx, dy로 탐색하자.
    state=0 : 밑으로 내려가는거
    state=1 : 오른쪽으로 가는거
    state=2 : 위로 가는거
def solution(n):
    answer = []
    candidates=[[0]*(n+1) for _ in range(n+1)]
    state=0
    dx=[1, 0, -1]
    dy=[0, 1, 0]
    x, y = 1, 1;
    data=1
    start_index=1
    for i in range(n, 0, -1):
        if state==0:
            for j in range(i):
                candidates[x][y]=data
                x += dx[state]
                y += dy[state]
                data+=1
            x-=dx[state]
            data-=1
            state=1
        
        elif state==1:
            candidates[x][y]=data
            for j in range(i):
                x += dx[state]
                y += dy[state]
                data+=1
                candidates[x][y]=data
            state=2
        
        else:
            for j in range(i):
                x += dx[state]
                y += dy[state]
                data+=1
                candidates[x][y] = data
            start_index+=1
            x+=1
            y=start_index
            state=0
            data+=1
    for cs in candidates:
        for c in cs:
            if c!=0:
                answer.append(c)

통과했지만 너무 더러움

개수만큼 만든 풀이

def solution(n):
    # 각 행의 길이가 1, 2, …, n 인 삼각형 리스트 생성
    triangle = [[0] * (i + 1) for i in range(n)]
    num = 1
    x, y = -1, 0  # 첫 이동 전에 위치 지정
    # 한 사이클마다 아래, 오른쪽, 좌상 이동을 하며 채워나감
    for i in range(n, 0, -3):
        # 1) 아래로 i칸 이동
        for _ in range(i):
            x += 1
            triangle[x][y] = num
            num += 1

        # 2) 오른쪽으로 (i - 1)칸 이동
        for _ in range(i - 1):
            y += 1
            triangle[x][y] = num
            num += 1

        # 3) 좌상(대각선 위)으로 (i - 2)칸 이동
        for _ in range(i - 2):
            x -= 1
            y -= 1
            triangle[x][y] = num
            num += 1

    # 삼각형 리스트를 1차원 리스트로 평탄화하여 반환
    return [value for row in triangle for value in row]

알고보면 쉽다...

  • 한 사이클에 3변을 만들어버린다.
  • 개수만큼 만들어도 마지막 변 만들때 x-=1, y-=1해버리면 규칙에 맞음
  • 시작을 -1로 해도 됨...

0개의 댓글