728x90
programmers.co.kr/learn/courses/30/lessons/68645
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]);
'STUDY > Algorithm' 카테고리의 다른 글
[백준] 2579 계단오르기 python (0) | 2021.04.13 |
---|---|
[프로그래머스] LEVEL2 문자열 압축, python (0) | 2021.04.04 |
[프로그래머스] 최솟값만들기 python, C (0) | 2021.04.02 |
[프로그래머스] 3진법 뒤집기, python, C (0) | 2021.04.02 |
[프로그래머스] 두개 뽑아서 더하기 python, C (0) | 2021.04.02 |