티스토리 뷰
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
int v[n]; //ex) v[1]은 제목 1 아래의 제목 2의 개수를 의미합니다. 즉 하위제목의 개수를 저장하는 배열입니다.
int ans[n]; //답 (대입을 이용하니 초기화 하지 않아도 됩니다)
int stack[n][2]; //스택 (대입을 이용하니 초기화 하지 않아도 됩니다)
int cnt = 0; //스택의 position indicator
int before = 0;
for(int i=0; i<n; i++) { //n개 입력
v[i] = 0; //이건 초기화 해주어야 합니다.
int tmp;
scanf("%d", &tmp); //입력
if(!cnt || stack[cnt-1][0] <= tmp) { //스택이 비어있거나, 스택에서 가장 최근 것 보다 값이 같거나 더 클 때
if(before+1 < tmp) { //입력이 잘못되었는지를 검사
printf("-1");
return 0;
}
before = tmp; //갱신
//스택에 집어넣기
stack[cnt][0] = tmp;
stack[cnt++][1] = i;
//tmp은 tmp-1의 하위 제목입니다.
v[tmp-1]++;
} else { //스택에 요소가 있고, 스택에서 가장 최근 것보다 값이 작을 때
before = tmp; //갱신
while(cnt>0 && tmp <= stack[cnt-1][0]) { //스택보다 tmp의 값이 클 때까지 계속 스택의 요소들을 꺼냅니다.
--cnt;
int tmp2 = stack[cnt][0]; //스택에서 꺼낸 값의 값(제목)
ans[stack[cnt][1]] = v[tmp2]; //답을 출력하는 배열에 스택에서 꺼낸 값의 값(제목)의 바로 아래 하위제목의 개수를 대입
v[tmp2] = 0; //그런 다음 바로 아래 하위제목의 개수를 0으로 바꿈
}
//스택에 집어넣기
stack[cnt][0] = tmp;
stack[cnt++][1] = i;
//tmp은 tmp-1의 하위 제목입니다.
v[tmp-1]++;
}
}
while(cnt--) { //스택에 남은 값 꺼내기
int tmp2 = stack[cnt][0]; //스택에서 꺼낸 값의 값(제목)
ans[stack[cnt][1]] = v[tmp2]; //답을 출력하는 배열에 스택에서 꺼낸 값의 값(제목)의 바로 아래 하위제목의 개수를 대입
v[tmp2] = 0; //그런 다음 바로 아래 하위제목의 개수를 0으로 바꿈
}
for(int i=0; i<n; i++) printf("%d\n", ans[i]); //입력받은대로 출력
}
풀이 : 스택
1. 스택이 비어있거나, 스택에 가장 최근에 들어 온 값보다 같거나 더 크다면 스택에 집어 넣습니다
단 스택이 비어있을 때, 2이상의 값이 주어지거나, 스택의 최근 값보다 2이상 큰 경우 잘못된 입력이므로 -1을 출력한뒤 프로그램을 종료합니다.
2. 1.의 경우의 반대는 스택의 요소를 빼줍니다, 빼다가 이번에 입력된 값보다 작은 경우 중단 한 다음, 이번에 입력된 값을 스택에 넣어줍니다. 스택에서 뺀 경우 언제 입력됬는지를 이용하여 정답을 출력할때 이용할 ans에 하위 레벨의 개수를 저장합니다. 그런다음 하위레벨을 저장하고 있는 v의 값을 0으로 바꾸어 줍니다 (특정 레벨의 하위 레벨의 개수를 나타내는 값만)
3. 입력을 다 받았으나, 스택에 요소들이 남아있는 경우, 전부 pop 해줍니다. 이 과정엑서 2.에서 했던 것 처럼 입력된 순서에 맞는 위치의 ans에 옮겨주고 그 레벨의 v을 0으로 바꾸어 줍니다.
4. ans에 있는 요소들을 순서대로 출력합니다.
https://www.acmicpc.net/problem/25956
25956번: 목차 세기
첫째 줄에 목차가 가지고 있는 제목의 수 $N$이 주어진다. ($1 \le N \le 1\,000\,000$) 둘째 줄부터 순서대로 제목의 레벨 $l$이 주어진다. ($1 \le l \le N$)
www.acmicpc.net
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 13417번 카드 문자열 (백준) (0) | 2023.09.05 |
---|---|
c언어 25556번 포스택 (백준) (0) | 2023.08.29 |
c언어 25918번 북극곰은 괄호를 찢어 (백준) (0) | 2023.08.23 |
c언어 4889번 안정적인 문자열 (백준) (0) | 2023.08.22 |
c언어 14940번 쉬운 최단거리 (백준) (0) | 2023.08.22 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 누적 합
- 오프라인 쿼리
- java
- 백준
- DFS
- PASCAL
- 플로이드
- C++
- 1835
- Krustal
- BFS
- 그리디
- 최대공약수
- Segment Tree
- 1835번
- C언어
- 브루트포스
- 최소 스패닝 트리
- 세그먼트 트리
- find
- 그래프
- 기하학
- XOR
- union
- 스택
- 정렬
- DP
- 누적합
- 덱
- Lazy Propagation
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함