https://www.acmicpc.net/problem/17299
기본적으로 모두 스택 사용
1. 코드 데려온 곳 : 루시님 블로그 - (Stack + 배열 + StringBuilder 출력)
생각해보니 map을 쓸 이유가 없나 싶었다. 숫자범위만큼 배열을
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Map<Integer, Integer> map = new HashMap<>();
Stack<Integer> stack = new Stack<>();
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++){
int num =Integer.parseInt(st.nextToken());
arr[i] = num;
if(!map.containsKey(num)){
map.put(num, 1);
} else{
map.put(num, map.get(num)+1);
}
}
for(int i=0; i<N; i++){
//등장한 횟수로 비교
while ((!stack.isEmpty() && map.get(arr[stack.peek()]) < map.get(arr[i]))) {
arr[stack.peek()] = arr[i];
stack.pop();
}
stack.push(i);
}
while(!stack.isEmpty()){
arr[stack.pop()] = -1;
}
for(int num : arr){
bw.write(num+" ");
}
bw.flush();
bw.close();
}
}
2. 처음에 map으로 푼 코드 (stack + map + BufferedWriter 출력)
import java.io.*;
import java.util.*;
public class Main {
static final int MAX = 1_000_001;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Stack<Integer> stack = new Stack<>();
int n = Integer.parseInt(br.readLine());
int count[] = new int[MAX];
int index[] = new int[n];
int ans[] = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++) {
index[i] = Integer.parseInt(st.nextToken());
count[index[i]]++;
}
for(int i=0; i<n; i++) {
while(!stack.empty() && count[index[i]]>count[index[stack.peek()]]) {
ans[stack.pop()] = index[i];
}
stack.push(i);
}
while(!stack.empty()) {
ans[stack.pop()] = -1;
}
StringBuilder sb = new StringBuilder();
for(int i=0; i<n; i++) {
sb.append(ans[i] + " ");
}
System.out.println(sb.toString());
}
}
결과:
결과를 보고 메모리와 속도가 각각 다른걸 보고 실험을 해봤다.
예상:
메모리 증가 요인
- 배열 사용(입력 가능한 숫자의 수 만큼 배열을 생성해야함)
- StringBuilder 사용
시간 증가 요인
- Map(검색이 잦음)
실험 :
1번 : 배열 + StringBuilder
2번 : Map +BufferedWriter
3번 : 배열 + BufferedWriter
4번 : Map + StringBuilder
결론:
- Map의 경우 BufferedWriter우세
- 배열의 경우 StringBuilder가 더 빠르나 메모리 더 먹음
나중에 까봐야겠다.
'알고리즘 > 백준' 카테고리의 다른 글
백준 1918번 - 후위 표기식 (Java 8) (0) | 2022.03.14 |
---|---|
백준 1935번 - 후위 표기식 2 (0) | 2022.03.13 |
백준 17298번 - 오큰수 (Java 8) (0) | 2022.03.12 |
백준 10799번 - 쇠막대 (Java 8) (0) | 2022.03.12 |
백준 17413번 - 단어 뒤집기 2(Java 8) (0) | 2022.03.11 |
댓글