728x90
처음보면 되게 난해할 수 있는 문제이다. 방법이 있긴한가 싶었다.
처음 생각한 풀이는 DP였다. 그러나 DP는 최적의 값을 찾는 것인데 단순 배열 채우기가 DP?는 아닐거라 생각했다. 그다음은 dfs였는데 하삼각행렬만 가능하다고 치고 방향을 계속 바꿔주면 될 것 같았다.
이런 식으로 계속 규칙이 있음을 알 수 있다. 어차피 방향은 3가지뿐이라 재귀만 잘 따지면 가능할 것 같았다.
dir 이라는 방향을 저장해두는 변수를 하나 만들고
dir = 0 이면 아래방향
dir = 1 이면 오른쪽
dir = 2 이면 왼쪽 대각선
으로 이동하게 만들고 각 방향마다 몇번 이동해야하는지 정해두었다.
그런데 그림으론 저렇지만 코딩을하고나니 첫번째때 0,0 에서 시작하니까 첫 아래방향에 cnt = n - 1 이 되는 것을 알 수 있었다. 좀 더 매끄럽게 짤 수도 있겠지만 그냥 첫번째 순회때만 유도리를 챙겼다. 그리고 짜고 나니 이건 그냥 구현일 뿐 dfs는 아니었다. 그냥 함수이름만 dfs
#include <string>
#include <vector>
#include <iostream>
#define MAX 1001
using namespace std;
int boad[MAX][MAX];
void dfs(int herex, int herey,int num ,int cnt, int dir, int limit, int check){
if(cnt == limit){
if(check == 1){
if(dir == 1)
limit--;
}
else
limit--;
if(dir == 2){
dir = 0;
} else{
dir++;
}
check = -1;
cnt = 0;
}
boad[herex][herey] = num;
int nextx, nexty;
if(dir == 0){
nextx = herex + 1;
nexty = herey;
}else if(dir == 1){
nextx = herex;
nexty = herey + 1;
}else{
nextx = herex - 1;
nexty = herey - 1;
}
if(boad[nextx][nexty] != -1){
return;
}
else dfs(nextx, nexty, num + 1, cnt + 1, dir, limit, check);
}
vector<int> solution(int n) {
vector<int> answer;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
boad[i][j] = -1;
}
}
dfs(0,0,1,0,0,n-1, 1);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++)
if(boad[i][j] != -1)
answer.push_back(boad[i][j]);
}
return answer;
}
흠... 난 분명 O(N) 이라 생각했는데 생각보다 시간이 오래걸렸다. 재귀 오버헤드 때문인가..?
'프로그래머스 풀이 > Lv 2' 카테고리의 다른 글
프로그래머스 - 카카오 프렌즈 컬러링북(C++) (0) | 2023.02.26 |
---|---|
프로그래머스 - N개의 최소공배수(C++) (0) | 2023.02.22 |
프로그래머스 - 마법의 엘리베이터(C++) (0) | 2023.02.20 |
프로그래머스 - 짝지어 제거하기(C++) (0) | 2022.12.27 |
프로그래머스 - 귤 고르기(C++) (0) | 2022.12.26 |