STUDY/Algorithm

[프로그래머스] LEVEL2 삼각 달팽이, python, C

sinawi95 2021. 4. 4. 19:32
728x90

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

def solution(n):
    n_list = [[0] * i for i in range(1, 1 + n)]
    max_val = (n ** 2 + n) // 2
    cnt = 0
    x, y = 0, 0

    direction = [(1, 0), (0, 1), (-1, -1)]
    dir_num = 0
    while cnt < max_val:
        cnt += 1
        n_list[x][y] = cnt
        dx = x + direction[dir_num][0]
        dy = y + direction[dir_num][1]
        if 0 <= dx < n and 0 <= dy < len(n_list[dx]) and n_list[dx][dy] == 0:
            x, y = dx, dy
        else:
            dir_num = (dir_num + 1) % 3
            x = x + direction[dir_num][0]
            y = y + direction[dir_num][1]

    answer = []
    for lst in n_list:
        answer.extend(lst)
    return answer

delta를 약간 변형해서 풀었다.

delta는 사방탐색에서 사용하는 거지만 여기에선 세방향만 탐색하면된다. 하향(1,0), 우향 (0,1), 좌상향(-1,-1)

달팽이 모양을 먼저 만들어두고 진행하려는 방향이 범위를 벗어나는지, 값이 있는지 확인하면된다.

 


#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int* solution(int n) {
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
    int max_val = n * (n+1) / 2;
    int* answer = (int*)calloc(max_val, sizeof(int));
    int n_list[n][n];
    for (int i = 0; i < n; i++){
        for (int j = 0; j <= i; j++)
            n_list[i][j] = 0;
    }
    int delta[3][2] = {{1, 0}, {0, 1}, {-1,-1}};
    int dir_num = 0;
    int x = 0, y = 0, cnt = 0;
    int dx, dy, col_len;
    while(cnt < max_val){
        n_list[x][y] = ++cnt;
        dx = x + delta[dir_num][0];
        dy = y + delta[dir_num][1];
        col_len = sizeof(n_list[dx]) / sizeof(int);
        if (0 <= dx && dx < n && 0 <= dy && dy < col_len && n_list[dx][dy] == 0){
            x = dx;
            y = dy;
        }
        else{
            dir_num = (dir_num + 1) % 3;
            x = x + delta[dir_num][0];
            y = y + delta[dir_num][1];
        }
    }
    
    cnt = 0;
    for (int i = 0; i < n; i++){
        for (int j = 0; j <= i; j++){
            answer[cnt++] = n_list[i][j];
        }
    }
    return answer;
}

C를 공부하기위해 python 코드를 변형했다.

calloc으로 최댓값까지 들어갈 배열을 0으로 초기화를 시켜주고 n*n 삼각행렬을 만든다.

나머지 부분은 다 똑같다.

python을 C로 옮기면서 자주하는 실수가 몇개 있다.

AND나 OR를 &&, ||로 바꾸지 않는것, 변수를 먼저 선언하지않고 사용하는것, if, for, while 등을 사용할때 중괄호를 쓰지 않는 것이다.

뭐 이번주 금요일에 비하면 어느정도 나아졌다고는 생각하는데 아직 갈길이 멀었다.

 

(+) 배열의 길이 구하는 방법

열은 배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠주면 되고, 열은 한 줄의 크기를 요소의 크기로 나눠주면 된다.

int col = sizeof(numArr[0]) / sizeof(int);
int row = sizeof(numArr) / sizeof(numArr[0]);