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
문제
풀이
해당 문제는 스택으로 풀었다.
1. 숫자가 나온 횟수를 배열에 저장한다. (number[])
2. 입력 받은 숫자만큼 for문을 돌면서 스택의 맨 위에 숫자가 같거나 크면 push. 이때 숫자의 인덱스를 push한다. (나중에 인덱스를 찾아 값을 변경하기때문)
3. 만약에 스택의 맨 위의 숫자가 더 작으면 큰 값이 나올 때까지 pop을 해주면서 result[] 인덱스 자리에 비교당한 값(스택에 들어올려는 값)을 넣어준다.
4. for 문이 끝나고 스택에 값이 남아있으면 -1로 값을 넣어준다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class BOJ17299 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int num = Integer.parseInt(br.readLine());
Stack<Integer> stack = new Stack<Integer>();
String[] ss = br.readLine().split(" ");
int input[] = new int[num];
for(int i=0;i<num;i++) {
input[i]=Integer.parseInt(ss[i]);
}
int number[]=new int[1000001];
for(int j=0;j<num;j++) {
number[input[j]]+=1;
}
int result[]= new int[num];
stack.push(0);
for(int i=1;i<num;i++) {
if(stack.isEmpty()) {
stack.push(i);
}
while(!stack.isEmpty() && number[input[stack.peek()]] < number[input[i]]) {
result[stack.pop()]=input[i];
}
stack.push(i);
}
while(!stack.isEmpty()) {
result[stack.pop()]=-1;
}
for(int x=0;x<num;x++) {
sb.append(result[x]+" ");
}
System.out.println(sb);
}
}
해당 문제는 17298 오큰수 문제를 풀면서 얻은 방법을 조금 변형하였다.
스택을 이용해서 문제를 푼다는 가장 핵심적인 힌트를 얻었기때문에 풀 수 있었다고 생각한다.
그래도 어려웠지만 ㅠㅠ
조금 더 익숙해질때까지 노력하자..
'코딩테스트' 카테고리의 다른 글
[BOJ_1929/JAVA] 소수 구하기 (0) | 2021.12.29 |
---|---|
[BOJ_1918/JAVA] 후위 표기식 (0) | 2021.12.27 |
[BOJ_17298/JAVA] 오큰수 (0) | 2021.12.19 |
[BOJ_9093/JAVA] 단어뒤집기 (0) | 2021.12.16 |
[BOJ_17413/JAVA] 단어뒤집기2 (0) | 2021.12.16 |