Notice
Recent Posts
Recent Comments
Link
HwangHub
[자바/자료구조] 코드트리 IM : 최솟값 3개 본문
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
알고리즘
간단하게 생각해서 최솟값 3개를 입력 받을때마다 빼고, 이를 곱한걸 출력하는 것이니, 입력 받을때마다 어떻게 최솟값을 뽑아낼지만 고민하면 된다. 중복되는 값이 존재할 수 있는 경우에서 최솟값을 매번 찾는 연산을 수행하려면 O(logN)으로 수행 가능한 우선순위 큐를 사용하면 좋다.
V1 : 틀림
처음엔 이게 왜 틀렸는지 알 수 없었다... 결론은 오버플로우 때문이다. int 타입끼리 3개만 곱하더라도 n의 최대가 100,000이므로 10^15제곱을 표현할 수 없는 int는 오버플로우가 발생할 수 밖에 없다. 이처럼 출력해야 하는 값이 매우 커지는 경우에는 그 피산 타입을 연산 전에 long으로 형변환해주는 작업이 필요하다. 앞으로는 절대 까먹지 말고 주의하자.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
Queue<Integer> queue = new PriorityQueue<>();
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
queue.add(Integer.parseInt(st.nextToken()));
if (queue.size() < 3) {
System.out.println(-1);
} else {
int p1 = queue.poll();
int p2 = queue.poll();
int p3 = queue.poll();
System.out.println(p1 * p2 * p3);
queue.add(p1);
queue.add(p2);
queue.add(p3);
}
}
}
}
V2 : 정답
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
Queue<Integer> queue = new PriorityQueue<>();
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
queue.add(Integer.parseInt(st.nextToken()));
if (queue.size() < 3) {
System.out.println(-1);
} else {
long p1 = queue.poll();
long p2 = queue.poll();
long p3 = queue.poll();
System.out.println(p1 * p2 * p3);
queue.add((int)p1);
queue.add((int)p2);
queue.add((int)p3);
}
}
}
}
'workspace > 알고리즘' 카테고리의 다른 글
[자바/DFS/런타임에러] 코드트리 IL : 안전지대 (0) | 2023.08.25 |
---|---|
[누적합/자바] 코드트리 IM : 씨 오 더블유 ~ 연산한 답은 long으로 (0) | 2023.08.06 |
[자바/자료구조] 코드트리 IM : 앞에서부터 삭제하기 2 (0) | 2023.07.31 |
[자바/해시맵] 코드트리 IM: 낮은 지점들 - int의 범위 (0) | 2023.07.28 |
[자바/해시맵] 코드트리 IM: 두 수의 합 (0) | 2023.07.28 |
Comments