일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 멀티스레드
- 알고리즘
- C++
- Server
- 구현
- 코딩테스트 스터디
- React
- dfs
- 코딩테스트
- N과 M(2)
- 자바스크립트
- 완전탐색
- 메모리 배리어
- c#
- map
- 제로베이스
- 서버
- MemoryBarrier
- 프론트엔드 스쿨
- JavaScript
- 백트래킹
- socket
- 백준
- 프로그래머스
- BFS
- Algorithm
- leetcode
- 제로베이스 프론트엔드 스쿨
- 문자열&연산자
- 구조체
- Today
- Total
Written
프로그래머스 레벨2 <삼각 달팽이> C++ 풀이 본문
https://school.programmers.co.kr/learn/courses/30/lessons/68645
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
결국 문제에 조건이 주어져 있는것처럼, 구현을 하는 문제라고 생각을 했습니다.
특별한 알고리즘을 사용하는 것은 아니고 구현 문제라고 생각하여, 일단 3가지의 케이스가 있으니 각 케이스에 맞게 함수를 구현해봤습니다. 그리고 모든 테스트케이스가 위에서 왼쪽 아래로 -> 오른쪽으로 -> 왼쪽위로 계속 돌다가 끝나는 구조입니다.
다만, 어떤 케이스에서 끝날지는 모르고, 그 대신 총 횟수는 Input값인 n만큼만 진행됩니다. 이런 특징들에 맞게 구현을하면 크게 어렵지 않게 구현이 가능합니다. 저는 워낙 구조체를 좋아하여 구조체를 사용해서 구현해봤습니다. 그리고 숫자들을 입력할 수 있게 2차원 배열을 생성했습니다. 문제에서 그려진 그림에는 피라미드 형태로 그려지고 있지만, 왼쪽으로 다 밀어버렸다고 가정해도 똑같습니다. 그리고 그 형태는 일반적인 2차원 배열과 같습니다. 구조체의 cnt는 찍어내는 총 횟수고 , val값은 처음 찍기시작할 값입니다.
채점을 받는데 분명 로직적으로는 문제가 없는데 출력이 잘 안찍혔습니다. 그래서 VS로 옮겨서 하나씩 디버깅해본 결과, 각각의 함수에서 마지막에 리턴하는 구조체의 x와y의 좌표값이 수정이 필요했습니다. 리턴값으로 받은 그대로 다음 단계에서 바로 숫자를 찍어내기 때문에 x와y값을 바로 다음 단계를 진행할 그 위치를 곧장 리턴해주도록 수정하니, 정답으로 채점 받을 수 있었습니다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
#include <string>
#include <vector>
using namespace std;
int map[1000][1000];
struct Node
{
int x;
int y;
int val;
int cnt;
Node(int a, int b, int c, int d)
{
x = a;
y = b;
val = c;
cnt = d;
}
};
Node leftBottom(int x, int y, int val, int cnt)
{
int tmp = cnt - 1;
while (cnt > 0)
{
cnt--;
if (map[x][y] == 0)
{
map[x][y] = val++;
x++;
}
}
return Node(x-1, y+1, val, tmp);
}
Node rightTop(int x, int y, int val, int cnt)
{
int tmp = cnt - 1;
while (cnt > 0)
{
cnt--;
if (map[x][y] == 0)
{
map[x][y] = val++;
y--;
x--;
}
}
return Node(x + 2,y + 1, val, tmp);
}
Node right(int x, int y, int val, int cnt)
{
int tmp = cnt - 1;
while (cnt > 0)
{
cnt--;
if (map[x][y] == 0)
{
map[x][y] = val++;
y++;
}
}
return Node(x-1, y-2, val, tmp);
}
vector<int> solution(int n) {
vector<int> answer;
int cnt = 0;
auto init = Node(0, 0, 1, n);
while (cnt < n)
{
auto cur1 = leftBottom(init.x, init.y, init.val, init.cnt);
cnt++;
auto cur2 = right(cur1.x, cur1.y, cur1.val, cur1.cnt);
cnt++;
auto cur3 = rightTop(cur2.x, cur2.y, cur2.val, cur2.cnt);
init = Node(cur3.x, cur3.y, cur3.val, cur3.cnt);
cnt++;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (map[i][j] != 0)
answer.push_back(map[i][j]);
else
break;
}
}
return answer;
}
|
cs |
'알고리즘 문제풀이' 카테고리의 다른 글
프로그래머스 레벨2 <튜플> C++ 풀이 (0) | 2023.09.22 |
---|---|
프로그래머스 레벨2 <수식 최대화> C++ 풀이 (0) | 2023.09.19 |
프로그래머스 레벨2 <피로도> C++ 풀이 (0) | 2023.09.13 |
프로그래머스 레벨2 <두 큐 합 같게 만들기> C++ 풀이 (0) | 2023.09.08 |
프로그래머스 레벨2 <할인 행사> C++ 풀이 (2) | 2023.09.08 |