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

DongGu·2021년 4월 2일
0

코딩테스트 준비

목록 보기
1/1

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

첫 시도에 풀지 못했다.
구글링한 후 이해했다고 판단이 들었을 때, 스스로 코드를 짜보았더니 다행히 혼자 풀 수 있었다.

문제 풀이 아이디어

  • 현실에서 직선을 긋듯이, 숫자를 추가한다.
    -> drawing_cnt: 한 직선을 그을 때 추가해야할 원소의 갯수
    -> drawing_line: 직선을 그은 횟수다.
  • (x,y) 좌표를 구성한다.
    -> 변수 x=-1, y=0 를 정의한다.
    처음 숫자를 작성할 곳은 0,0인데, 로직상 -1,0에서 시작한다.
      
  • 직선 그은 횟수에 따라 (x,y) 좌표를 옮긴다.

문제 풀이

drawing_cnt

직관적으로 생각해보면 처음 긋는 직선(좌하향 대각선)에선 n개의 원소(1,2,...,n)를 적는다. 그 다음 우측 직선은 n-1개의 원소를 적는다. 그 다음 좌상향 대각선을 그을 땐 n-2개의 원소를 적는다. 한 번 직선을 그을 때마다 적어야할 원소의 갯수가 1개씩 줄어든다. drawing_cnt가 1개일 때까지만 반복한다.

drawing_line

삼각 달팽이다. 원소를 적어가는 방향이 3개다. 3을 나눈 나머지가 0,1,2으로 3개니까 이것을 활용하면 된다.
좌하향 직선, 우측 직선, 좌상향 직선이다.

문제 푸는 사람의 정의에 따라 조금 차이가 있을 수 있다.
나는 처음 그릴 때(좌하향 직선)를 나머지 0, 우측 직선일 때 나머지 1, 좌상향 직선일 때 나머지 2라고 정의했다.

x, y 좌표

정삼각형 이미지를 아래처럼 직각삼각형(좌측 정렬)으로 생각해도 문제가 없다. 그러면 좌표가 좀더 쉽게 이해될 것이다.

원소를 담을 2차원 리스트를 처음에 정의했다.
좌측 아래로 내려갈 땐 x+=1을 해줘야한다. 2차원 리스트 내에서 다음 리스트로 넘어가야 하기 때문이다.
오른쪽으로 갈 땐 y+=1이다. list in list 내에서 다음 원소로 이동해야 한다.
좌측 위로 올라갈 땐 x-=1, y-=1이다. 앞의 리스트로, 앞의 원소로 이동해야 하기 때문이다.

def calc_axis(drawing_line, x, y):
    # 아래로 내려가는 경우 (x+=1)
    if drawing_line % 3== 0:
        x+=1
    # 오른쪽으로 한 칸씩 가는 경우(y+=1)
    elif drawing_line % 3== 1:
        y+=1
    # 위로 가는 경우(x-=1, y-=1)
    else:
        x-=1; y-=1
    return x,y

def solution(n):
    answer = [[0]*(i+1) for i in range(n)]
    adding_num = 0

    # 한줄 쫙 긋는 경우 n개로 시작
    # 그 다음 n-1개, 그 다음 n-2개 .... 1개까지
    drawing_cnt = n

    # 줄 그은 갯수 drawing_line
    # 나머지 0: 내려간다
    # 나머지 1: 오르쪽으로 간다
    # 나머지 2: 위로 올라간다.
    drawing_line = 0
    x,y = -1, 0
    while drawing_cnt >=1:
        for i in range(drawing_cnt):
            adding_num +=1
            x, y = calc_axis(drawing_line, x, y)
            answer[x][y] = adding_num
        drawing_line +=1
        drawing_cnt -=1

    result = []
    for a in answer:
        result+=a
    return result
profile
코딩하는 신방과생

0개의 댓글