반응형
https://www.acmicpc.net/problem/30470
[풀이과정]
stack을 사용하였고 max가 갱신될 때마다 stack에 저장된 값들을 확인하면서 길이를 갱신하며 pop, push를 해주었는데 틀림. 로직은 맞는 것 같은데 왜 틀린지 잘 모르겠음.
정답코드는 max 갱신 시마다 값을 확인하는 로직을 없앰. 새로 추가되는 통나무가 항상 제일 긴 통나무이고 max 값을 기준으로 통나무 길이가 갱신되는 것이기 때문에 max값만 저장해준 후 sum 값을 구할 때 로직 실행해켜주면 됨.
[코드]
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int N;
static Stack<Long> stack = new Stack<>();
static long result;
public static void main(String[] args) throws IOException {
init();
if (!stack.isEmpty()) {
sum();
}
System.out.println(result);
}
static void init() throws IOException {
N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
long A = Long.parseLong(st.nextToken());
long B = Long.parseLong(st.nextToken());
if (A == 1) {
addTree(B);
} else {
if (!stack.isEmpty()) {
magic(B);
}
}
}
}
static void addTree(long length) {
stack.push(length);
}
static void magic(long power) {
long K = stack.pop();
stack.push(Math.max(K - power, 0)); //max 값 push
}
static void sum() {
long top = stack.peek(); //가장 긴 통나무 길이
while (!stack.isEmpty()) {
long now = stack.pop();
if (now > top) { //더 긴 통나무
result += top;
} else if (now < top) {//더 짧은 통나무
top = now; //기준 길이 갱신
result += now;
} else {//길이 같음
result += now;
}
}
}
}
반응형
'알고리즘 > 스텍' 카테고리의 다른 글
[백준] 6198 : 옥상 정원 꾸미기 (JAVA) (0) | 2024.11.01 |
---|---|
[백준] 17680 : 막대기 (0) | 2023.03.29 |
[백준] 1874 : 스택수열 (1) | 2023.03.24 |
[백준] 1725 : 히스토그램 (0) | 2023.03.24 |
[백준] 9012 : 괄호 (0) | 2023.03.23 |