https://www.acmicpc.net/problem/17299
##문제 풀기 전 내가 알고 있었어야 할 개념 :
1_ 백준 17298번 문제인, "오큰수" 문제부터 이해하고 오기 [ https://www.acmicpc.net/problem/17298 ]
2_★ 입력된 정수 배열에 중복된 개수 Check => cnt배열 이용
ex)
3_ 17298번 vs 17299번 논리 비교
3_1) 공통 논리
- A배열 Scan 중. 1번째값은 Stack에 인덱스 그냥 Push()
- Stack에는 A배열의 원소가 아닌 인덱스 값을 넣는다.
- A[Stack.top()] 과 지칭값 비교(문제 조건에 따라 달라지는 규칙)
if_ⓐ 지칭값이 이기는 논리라면 => 결과배열[Stack.top()의 인덱스] = 지칭값; => Stack,top()을 Pop()
=> 다시 Stack의 top()과 지칭값 비교(while)
else if_ⓑ A[Stack.top()]이 이기는 논리라면 => 그냥 Push(지칭값의 인덱스);
3_2) 차이
- 17298 : A[Stack.top()] < 지칭값 => ⓐ / else => ⓑ (오큰수 조건 때문)
- 17299 : A[Stack.top()]의 중복횟수 < 지칭값의 중복횟수 => => ⓐ / else => ⓑ (오등큰수 조건 때문)
##예제입력1 분석해보기 (작성중 미완성)
##코드
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
|
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
void init() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
int main() {
init();
int N,max=0,min=0;
cin >> N;
vector <int> A(N);
vector <int> B(N,-1);
stack <int> S;
for (int i = 0; i < N; i++) {
int input;
cin >> input;
A[i]= input;
//최대 최소 구하기
if (input > max) {
max = input;
}
if (input < min) {
min = input;
}
}
vector <int> cnt(max - min + 1+1, 0);
for (int i = 0; i < N; i++) {
cnt[A[i]]++;
}
for (int i = 0; i < N; i++) {
while (S.size() > 0 && cnt[A[S.top()]] < cnt[A[i]]) {
B[S.top()] = A[i];
S.pop();
}
S.push(i);
}
for (int i = 0; i < N; i++)cout << B[i] << '\n';
return 0;
}
|
cs |
'백준(C++) > 자료구조1' 카테고리의 다른 글
[BOJ/C++]1935번_후위 표기식2_풀이2 (0) | 2024.07.18 |
---|---|
[BOJ/C언어]1935번_후위 표기식2 (0) | 2024.07.18 |
[BOJ/C++]17298_오큰수 (작성중..) (2) | 2024.07.15 |
[BOJ/C++]10799_쇠막대기 (0) | 2024.07.13 |
[BOJ/C++]17414번_단어뒤집기 2 (0) | 2024.07.13 |