https://school.programmers.co.kr/learn/courses/30/lessons/68645
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
* 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<int> solution(int n) {
vector<int> answer;
int arr[1001][1001];
// 이걸 좀 보기 편하게 생각해보면 왼쪽으로 쫙 밀었을 때 아래로 쭉 내려갔다가 오른쪽으로 쭉 갔다가 x-1, y-1하면서 올라갔다가를 반복하면서 모든 블록을 채울 때까지 반복하면 된다.
int x = 0, y = 0;
int state = 0; // state = 0: 아래로 내리기, 1: 우측으로보내기, 2: 왼쪽 위 대각선으로 가기
int num = 1;
for(int i=0; i<n; i++) {
switch(state) {
case 0:
for(int k=i; k<n; k++) {
arr[x++][y] = num++;
}
x--;
y++;
state = 1;
break;
case 1:
for(int k=i; k<n; k++) {
arr[x][y++] = num++;
}
x--;
// y가 이미 더해져 버려 -=2한다.
y-=2;
state = 2;
break;
case 2:
for(int k=i; k<n; k++) {
arr[x--][y--] = num++;
}
x+=2;
y++;
state = 0;
break;
}
}
for(int i=0; i<n; i++) {
for(int j=0; j<=i; j++) {
answer.push_back(arr[i][j]);
}
}
return answer;
}
* 해설
이 문제는 3개의 연산을 반복하는 구조다. 2차원 배열에 놓고 그림을 생각해보면
1) 맨 아래쪽으로 (x값을 증가시키며) 내려가는 동작
2) 오른쪽으로 (y값을 증가시키며) 가는 동작
3) 왼쪽 위 대각선으로 (x--, y--) 가는 동작
이 3가지가 있다.
이것을 반복해가며 배열에 num을 1씩증가시키며 차례대로 넣은 후 그 배열 그대로 vector에 넣으면 해결이다. 간단하지만 각각의 동작을 구현하고 다음 동작으로 넘어가게 하는 것에 대해 많은 생각을 하게 하는 문제였다.
다른 사람의 풀이도 찾아보았는데 다른 사람은 아예 %3 == 0 , 1, 2 를 이용해 스위치문을 사용하지 않고 푼 것을 확인할 수 있었다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
26. 쿼드압축 후 개수 세기 Lv.3 : 월간 코드챌린지 시즌1 (C++) (0) | 2024.11.21 |
---|---|
25. 이진 변환 반복하기 Lv.2 : 월간 코드 챌린지 시즌 1 (0) | 2024.11.20 |