티스토리 뷰
https://www.acmicpc.net/problem/17299
17299번: 오등큰수
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
www.acmicpc.net

문제
크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오등큰수 NGF(i)를 구하려고 한다.
Ai가 수열 A에서 등장한 횟수를 F(Ai)라고 했을 때, Ai의 오등큰수는 오른쪽에 있으면서 수열 A에서 등장한 횟수가 F(Ai)보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오등큰수는 -1이다.
예를 들어, A = [1, 1, 2, 3, 4, 2, 1]인 경우 F(1) = 3, F(2) = 2, F(3) = 1, F(4) = 1이다. A1의 오른쪽에 있으면서 등장한 횟수가 3보다 큰 수는 없기 때문에, NGF(1) = -1이다. A3의 경우에는 A7이 오른쪽에 있으면서 F(A3=2) < F(A7=1) 이기 때문에, NGF(3) = 1이다. NGF(4) = 2, NGF(5) = 2, NGF(6) = 1 이다.
요약
- 인덱스를 기준으로 오른쪽에 있는 수 중 등장 횟수가 더 많은 가장 왼쪽의 수(처음 수)를 저장하는 문제
유형 : 자료구조 (스택)
주의
- 스택에 수를 저장할 때 인덱스도 함께 저장해야 한다.
- 수가 저장되지 않은 곳에는 -1을 출력하도록 한다.
- 등장 횟수를 저장하기 위해 처음에는 HashMap을 사용했다. 하지만 배열에 저장해도 충분하고 속도 차이가 어마무시하다....
전체 코드
import java.io.*;
import java.util.*;
public class Main {
static int n = 0;
static int[] board;
static int[] count = new int[1000001];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
board = new int[n+1];
st = new StringTokenizer(br.readLine(), " ");
for(int i=1;i<=n;i++){
board[i] = Integer.parseInt(st.nextToken());
count[board[i]] += 1;
}
Stack<Node> stack = new Stack<>();
StringBuilder sb = new StringBuilder();
int[] result = new int[n+1];
for(int i=1;i<=n;i++){
while(!stack.isEmpty()){
Node tmp = stack.peek();
if(count[tmp.v] < count[board[i]]){
result[tmp.i] = board[i];
stack.pop();
}
else{
break;
}
}
stack.push(new Node(board[i],i));
}
for(int i=1;i<=n;i++){
if(result[i] == 0)
sb.append(-1+" ");
else
sb.append(result[i]+" ");
}sb.append("\n");
System.out.print(sb);
br.close();
}
}
class Node{
int v;
int i;
Node(int v,int i){
this.v = v;
this.i = i;
}
}'알고리즘 > 백준' 카테고리의 다른 글
| 백준 15644 (구슬 탈출 3) - java (1) | 2023.10.08 |
|---|---|
| 백준 4195 (친구 네트워크) - java (0) | 2023.10.05 |
| 백준 17472 (다리 만들기 2) - java (0) | 2023.10.04 |
| 백준 12851 (숨바꼭질 2) - java (1) | 2023.10.03 |
| 백준 3649 (로봇 프로젝트) - java (1) | 2023.10.02 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준 #4963 #섬의 개수
- 백준 #13549 #숨바꼭질3
- 17218
- 백준
- 백준 #치즈 #2638
- 백준 #1987 #알파벳 #자바 #java
- 자바 #JAVA
- 백준 #28140 #빨강~ 빨강~ 파랑! 파랑! 달콤한 솜사탕! #java #자바
- 백준 #3980 #선발 명단
- 자바
- 백준 #16973 #직사각형 탈출
- 백준 #25603 #짱해커 이동식 #java #자바
- 백준 #18405 #경쟁적 전염
- 백준 #1584 #게임 #java #자바
- 백준 #
- 백준 #2580 #스도쿠
- 백준 #인구 이동 #16234
- 백준 #17940 #주식 #자바 #java
- 백준 #14863 #서울에서 경산까지 #java #자바
- 백준 #5721 #사탕 줍기 대회 #java #자바
- 백준 #1759 #암호 만들기
- 백준 #2636 #치즈
- 백준 #15686 #치킨 배달
- 올해보다
- 백준 #다리 만들기 #2146
- 백준 #12014 #주식 #자바 #java
- 행복합시다.
- 백준 #1325 #효율적인 해킹
- Java
- 17394
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함