[알고리즘] 삼각 달팽이

sith-call.dev·2023년 4월 18일
0

알고리즘

목록 보기
3/47
def solution(n):
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    matrix = [[0 for x in range(n)] for y in range(n)]
    x, y = 0, 0
    cnt = 1
    while True:
        
        # 아래 방향
        while True:
            if x >= n or y >= n or x < 0 or y < 0:
                break
            if matrix[y][x] != 0:
                break
            matrix[y][x] = cnt
            cnt += 1
            x += dx[3]
            y += dy[3]
        
        # 방향 전환을 위한 좌표 조정
        x = x + dx[1] - dx[3]
        y = y + dy[1] -dy[3]
        
        # 오른쪽 방향
        while True:
            if x >= n or y >= n or x < 0 or y < 0:
                break
            if matrix[y][x] != 0:
                break
            matrix[y][x] = cnt
            cnt += 1
            x += dx[1]
            y += dy[1]
        
        # 방향 전환을 위한 좌표 조정
        x = x + dx[0] - dx[1]
        y = y + dy[2] - dy[1]
        
                
        # 위쪽 대각선 방향
        while True:
            if x >= n or y >= n or x < 0 or y < 0:
                break
            if matrix[y][x] != 0:
                break
            matrix[y][x] = cnt
            cnt += 1
            x += dx[0]
            y += dy[2]
        
        
        # while문 재진입을 위한 좌표 조정
        x = x + dx[3] - dx[0]
        y = y + dy[3] - dy[2]
        if x >= n or y >= n or x < 0 or y < 0:
            break
        if matrix[y][x] != 0:
            break
    
    answer = []
    for row in matrix:
        temp_row = [x for x in row if x != 0]
        answer += temp_row
    
    return answer

소감

내가 놓친 점은 방향 전환을 위한 좌표 조정 부분이다.
대략적인 큰 알고리즘 설계는 어렵지 않다고 생각한다.
그러나 엣지 케이스에서 발생하는 처리들이 어렵다고 생각한다.
그렇기 때문에 알고리즘을 구성하는 절차 중에서 다음 절차로 넘어갈 때 엣지 케이스와 같은 것들이 발생하는지 파악하자.
(나는 조건이 종료되거나 시작되는 지점에서의 케이스도 엣지 케이스라고 표현했다. 나만의 임의적인 방법이니 오해 없길 바란다.)
또한 내가 원하는 조건을 수식으로 표현하는 방법에도 익숙해질 필요가 있다.

흐름

  1. 삼각형을 2차원 배열에 맵핑한다. (난 직각 삼각형을 채우는 방식으로 바꿨다.)
  2. 아래 방향으로 수를 채운다.
  3. 오른쪽 방향으로 수를 채운다.
  4. 왼쪽 위 대각선 방향으로 수를 채운다.
  5. 2~3번 과정을 삼각형이 다 채워질 때까지 반복한다.
profile
lim (time → ∞) Life(time) = LOVE

0개의 댓글

관련 채용 정보