[SWEA 1206번] View with Java

guswls·2024년 5월 13일
0

알고리즘

목록 보기
32/39
post-custom-banner

문제




코드


	
import java.util.*;
import java.io.*;
 
class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        StringBuilder sb = new StringBuilder();
        for (int t = 0; t < 10; t++) {
            int N = Integer.parseInt(br.readLine());
            int[] arr = new int[N];
 
            // 입력
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int i = 0; i < N; i++) {
                arr[i] = Integer.parseInt(st.nextToken());
            }
 
            // 계산
            int ret = 0;
            for (int i = 2; i < N - 2; i++) {
                int left = Math.max(arr[i - 1], arr[i - 2]);
                int right = Math.max(arr[i + 1], arr[i + 2]);
                int sub = Math.max(left, right);
 
                if (arr[i] > sub) {
                    ret += (arr[i] - sub);
                }
            }
 
            sb.append(String.format("#%d %d\n", t + 1, ret));
 
        }
        System.out.println(sb);
    }
}


문제 이해


  • 문제와 그림을 보면 쉽게 이해할 수 있다.
  • 건물의 개수가 N개만큼 순서대로 주어진다.
  • 이때 현재 위치에서 양 옆 두 칸을 비교하여 그 중 가장 큰 값과 현재 위치 값의 차이를 구한다.
  • 이 차이를 모두 더해 답으로 출력한다,


풀이 방법


  • 이해한대로 그대로 구현하면 된다.
  • 만약 맨 왼쪽 두 칸과 맨 오른쪽 두 칸의 값이 채워져있었으면, 따로 N + 4만큼 공간을 확보해야 됐을 것이다.
  • 하지만 제약 사항에서 보이다시피, 맨 왼쪽 두 칸과 맨 오른쪽 두 칸은 0으로 채워져있다.
  • 따라서 그냥 2 ~ N-2 범위를 for문으로 순회하며 왼쪽 두 칸과 오른쪽 두 칸중에 가장 큰 값을 구해 현재 값에서 빼주면 된다.


핵심 포인트


  • 제약사항을 꼼꼼히 본 후 문제를 해결하자.


보완할 점 / 느낀 점


  • 그렇게 어려운 문제는 아닌 것 같다.
  • D3문제도 코테 전 최대한 많이 풀어서 가야겠다.


참고자료


profile
안녕하세요
post-custom-banner

0개의 댓글