2304번: 창고 다각형
첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의
www.acmicpc.net
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] gidung = new int[1001];
int start = 1001; int end = 0;
for(int i=0; i<N; i++){
int x = sc.nextInt();
int y = sc.nextInt();
gidung[x] = y;
start = Math.min(x,start);
end = Math.max(x, end);
}
//왼->오 탐색
Stack<Integer> stack = new Stack<>();
int temp = gidung[start];
for(int i=start+1; i<=end; i++){
if(temp > gidung[i])
stack.push(i);
else{
while(!stack.isEmpty()){
int n = stack.pop();
gidung[n] = temp;
}
temp = gidung[i];
}
}
stack.clear();
//오->왼 탐색
temp = gidung[end];
for(int i=end-1; i>=start; i--){
if(temp > gidung[i])
stack.push(i);
else{
while(!stack.isEmpty()){
int n = stack.pop();
gidung[n] = temp;
}
temp = gidung[i];
}
}
stack.clear();
//정답 추출
int ans = 0;
for(int i=start; i<=end; i++){
ans += gidung[i];
}
System.out.println(ans);
}
}
왼쪽-현재-오른쪽 으로 비교하면서 gidung[]을 업데이트하는 식으로 풀다가 포기하고 다시 풀었다.
왼쪽 -> 오른쪽으로 한쪽 방향으로만 비교해야한다고 생각했는데!
왼->오, 오->왼 으로 한쪽 방향으로 각각 수행한 다음에 답을 출력한다는 방법이 있음에 머리를 탁! 쳤다.
[문제 풀이 생각 과정]
1. 입력으로 기둥의 시작과 끝을 기억한다. - start, end 변수
gidung[위치] = 높이 로 저장한다.
2. 왼 -> 오른쪽으로 탐색한다.
1) 처음 기준(temp)를 gidung[start] 로 설정하고
2) start+1 ~ end까지 돌면서, 기준보다 작다면 스택에 push한다.
3) 만약 기준보다 같거나 크다면,
스택에 들어있는 모든걸 pop하고, gidung[pop한 값]=기준 으로 바꾸어준다.
기준보다 같거나 큰 값으로 기준을 변경한다.
3. 스택 초기화
4. 오른쪽 -> 왼쪽으로 똑같이 탐색한다.
5. start ~ end 까지 gidung[i]값을 출력할 값에 더해주고, 출력!
[예시]
1. gidung[] = {0, 0, 4, 0, 6, 3, 0, 0, 10, 0, 0, 4, 0, 6, 0, 8, 0, ..., 0} 로 저장된다.
start = 2
end = 15
2. 왼 -> 오른쪽 탐색 후
gidung[] = {0, 0, 4, 4, 6, 6, 6, 6, 10, 0, 0, 4, 0, 6, 0, 8, 0, ..., 0}
3. 오른 -> 왼쪽 탐색 후
gidung[] = {0, 0, 4, 4, 6, 6, 6, 6, 10, 8, 8, 8, 8, 8, 8, 8, 0, ..., 0}
4. start ~ end 까지 모두 더하는 과정
ans = 4 + 4 + 6 + 6 + 6 + 6 + 10 + 8 + 8 + 8 + 8 + 8 + 8 + 8 = 98
'1d-1c > BOJ' 카테고리의 다른 글
2750_수 정렬하기1 (JAVA) (0) | 2020.10.28 |
---|---|
14179_빗물 (JAVA) (0) | 2020.10.27 |
1152_단어의 개수 (JAVA) (0) | 2020.10.26 |
[변형 문제] 백준 1662_압축 (0) | 2020.10.26 |
1662_압축 (JAVA) (0) | 2020.10.26 |