일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Gold
- BFS
- LEVEL2
- 프로그래머스
- binary search
- level1
- Project
- stack
- programmers
- knapsack Problem
- Bronze
- effective C++
- Modern C++
- PrefixSum
- Zenject
- 8-Puzzle
- Unity
- trie
- algorithm
- solid 원칙
- BOJ
- two pointer
- level3
- Silver
- Euclidean
- SWEA
- dirtyflag pattern
- 3D RPG
- Flyweight Pattern
- 프로세스 상태
Archives
- Today
- Total
Patrick's Devlog
[프로그래머스/C++] 삼각 달팽이 본문
1. 문제 개요
https://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
1-1. 설명
정수 n이 매개변수로 주어지며, 아래의 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한다. 이 때 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return하도록 하는 함수를 완성한다.
1-2. 제한사항
- n은 1이상 1,000 이하
2. 구현
2-1. 풀이
2차원 벡터를 n x n 크기만큼 0으로 초기화해준다. 그리고 이 배열에 반시계 방향으로 count를 주어 1씩 더하며 숫자를 채워준다. 방향은 up, down, right로 지정해주었다. 각 방향의 끝에 도달했거나, 원소가 존재하면 방향을 바꾸어 이어서 숫자를 채운다.
2-2. 코드
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int n) {
vector<int> answer;
int size = n * (n-1) / 2 + n; // 채워야할 숫자의 크기
int count = 1; // 0을 대처할 정수
int index1 = 0;
int index2 = 0;
// 2차원 배열의 index
vector<vector<int>> list(n, vector<int>(n)); // n x n 크기의 vector
string dir = "down";
// down -> right -> up (반복)
for (int i = 0; i < size; i++) {
// 화살표 방향 지정
if (dir == "down"){ // 아래로 향할 때
list[index1][index2] = count;
count++;
if (index1 + 1 == n || list[index1 + 1][index2] != 0) {
dir = "right";
index2++;
}
else index1 += 1;
} else if (dir == "right"){ // 오른쪽으로 향할 때
list[index1][index2] = count;
count++;
if (index2 +1 == n || list[index1][index2 + 1] != 0){
dir = "up";
index1--;
index2--;
}
else index2 += 1;
} else if (dir == "up") { // 위로 향할 때
list[index1][index2] = count;
count++;
if (list[index1 - 1][index2 - 1] != 0) {
dir = "down";
index1++;
}
else {
index1 -= 1;
index2 -= 1;
}
}
}
for (int i = 0; i < n ;i++){
for (int j = 0; j < n ; j++){
if (list[i][j] != 0) answer.push_back(list[i][j]);
}
}
// 저장된 2차원 벡터를 1차원 벡터에 저장
return answer;
}
'Algorithm > Algorithms Practice' 카테고리의 다른 글
[BOJ/C++] 소수(2581번) (0) | 2022.05.13 |
---|---|
[BOJ/C++] 스네이크버드(16435번) (0) | 2022.05.12 |
[BOJ/C++] 2007년(1924번) (0) | 2022.05.10 |
[프로그래머스/C++] 최솟값 만들기 (0) | 2022.05.05 |
[프로그래머스/C++] 예산 (0) | 2022.05.02 |