
난이도: ★★☆☆☆ • solved on: 2025-11-17


자료구조
알고리즘/기법
핵심 키워드
- 문제 분해
- 각 스택의 총합을 계산한다.
- 세 합이 같아질 때까지 가장 큰 합을 가진 스택에서 top 원소를 제거한다.
- top이 리스트의 첫 요소이므로
remove(0)으로 pop을 대체한다.
핵심 로직 흐름
while (모든 합이 동일하지 않으면): 가장 큰 합을 가진 스택 선택 해당 스택의 top 제거(remove(0))예외 처리
- 스택 중 하나라도 비면 결과는 0
public static int equalStacks(List<Integer> h1, List<Integer> h2, List<Integer> h3) {
// Write your code here
int[] sumArr = {0, 0, 0, 0};
for(int item : h1){
sumArr[1] += item;
}
for(int item : h2){
sumArr[2] += item;
}
for(int item : h3){
sumArr[3] += item;
}
while(!(sumArr[1]==sumArr[2] && sumArr[2]==sumArr[3])){
if(sumArr[1] <= sumArr[2]){
if(sumArr[2] <= sumArr[3]){
sumArr[3] -= h3.get(0);
h3.remove(0);
} else {
sumArr[2] -= h2.get(0);
h2.remove(0);
}
} else {
if(sumArr[1] <= sumArr[3]){
sumArr[3] -= h3.get(0);
h3.remove(0);
} else {
sumArr[1] -= h1.get(0);
h1.remove(0);
}
}
}
return sumArr[1];
}
- 문제 분해
- 리스트에서
remove(0)은 매번 전체를 shift하여 O(n) 비용이 발생한다.- 따라서 top 제거를 인덱스 증가(i++)로만 처리하여 제거 비용을 없앤다.
- 세 스택의 총합만 갱신하며 진행한다.
핵심 로직 흐름
index1, index2, index3 각 0에서 시작 while (세 높이가 같지 않으면): 현재 가장 큰 높이를 가진 스택에서 index++ 적용예외 처리
- 인덱스가 리스트 끝에 도달하면 스택은 비게 되며 결과는 0 (첫 풀이와 동일)
public static int equalStacks(List<Integer> h1, List<Integer> h2, List<Integer> h3) {
int s1 = h1.stream().mapToInt(i -> i).sum();
int s2 = h2.stream().mapToInt(i -> i).sum();
int s3 = h3.stream().mapToInt(i -> i).sum();
int i1 = 0, i2 = 0, i3 = 0;
while (!(s1 == s2 && s2 == s3)) {
int max = Math.max(s1, Math.max(s2, s3));
if (max == s1) s1 -= h1.get(i1++);
else if (max == s2) s2 -= h2.get(i2++);
else s3 -= h3.get(i3++);
}
return s1;
}
remove(0) = O(N) × 반복)h1.stream().mapToInt(i -> i).sum()의 방식을 통해 리스트의 전체 합을 구하는 방식의 가독성을 높일 수 있다.각 메소드의 의미와 흐름
h3.stream()
리스트 h3를Stream형태로 변환한다. → 리스트를 하나씩 순회할 수 있는 “흐름”이 생성된다. (기존에는 직접 for문으로 접근해야했다.)
.mapToInt(i -> i)
Stream안에 있는Integer객체를int형으로 변환한다.
- (i -> i) 라는 람다식은 “원소 i를 그대로 int로 변환한다”는 의미
.sum()
이제int형태의 스트림이 되었기 때문에
.sum()을 호출하면 모든 값을 더한 합이 나온다.
java.util.stream interface를 활용하면 리스트 내의 값들에 대한 연산을 더 쉽게 할 수 있다. (Stream (Java Platform SE 8) )비슷한 유형 (GPT 추천)
확장 문제 (GPT 추천)