관리 메뉴

100세까지 코딩

[SWEA] 1206. View (JAVA) 본문

코딩테스트/자바

[SWEA] 1206. View (JAVA)

100세까지 코딩 2023. 11. 4. 02:00
문제 설명

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

https://swexpertacademy.com/main/solvingProblem/solvingProblem.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

풀기 전 생각
  • 슬라이딩 윈도우와 비슷한 느낌
  • 배열을 미리 1001로 초기화하고 입력받은 빌딩 수만큼 빌딩 높이 저장
  • 5개를 한 묶음으로 생각하며 i = 2부터 시작하여 (i  = 빌딩 수 - 2)만큼 반복
  • i-2, i-1, i+1, i+2 중에 가장 높은 건물 높이를 구하여 현재 빌딩이 더 크면 (현재 빌딩 - 가장 높은 건물 높이)
  • 더해나가면서 총세대수를 구하기
코드

import java.util.Scanner;
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;

class SweaBuilding {
    static int[] height = new int[1001];

    public static void main(String args[]) throws IOException {
        int T = 10;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        for (int test_case = 1; test_case <= T; test_case++) {
            int sum = 0;
            int cnt = Integer.parseInt(br.readLine());
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int i = 0; i < cnt; i++) {
                height[i] = Integer.parseInt(st.nextToken());
            }
            for (int i = 2; i < cnt - 2; i++) {
                int max = findMax(height[i - 2], height[i - 1], height[i + 1], height[i + 2]);
                if (height[i] > max) {
                    sum += height[i] - max;
                }
            }
            System.out.println("#" + test_case + " " + sum);
        }
    }

    public static int findMax(int a, int b, int c, int d) {
        int max = 0;
        if (a > b) {
            if (a > c) {
                if (a > d) {
                    max = a;
                } else {
                    max = d;
                }
            } else {
                if (c > d) {
                    max = c;
                } else {
                    max = d;
                }
            }
        } else {
            if (b > c) {
                if (b > d) {
                    max = b;
                } else {
                    max = d;
                }
            } else {
                if (c > d) {
                    max = c;
                } else {
                    max = d;
                }
            }
        }
        return max;
    }
}

오류 및 개선 
  • findMax 함수가 너무 길고 가독성이 부족
최종 코드

import java.util.Scanner;
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;

class SweaBuilding {
    static int[] height = new int[1001];

    public static void main(String args[]) throws IOException {
        int T = 10;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        for (int test_case = 1; test_case <= T; test_case++) {
            int sum = 0;
            int cnt = Integer.parseInt(br.readLine());
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int i = 0; i < cnt; i++) {
                height[i] = Integer.parseInt(st.nextToken());
            }
            for (int i = 2; i < cnt - 2; i++) {
                int max = findMax(height[i - 2], height[i - 1], height[i + 1], height[i + 2]);
                if (height[i] > max) {
                    sum += height[i] - max;
                }
            }
            System.out.println("#" + test_case + " " + sum);
        }
    }

    public static int findMax(int a, int b, int c, int d) {
        int max = a;
        if(b > max) max = b;
        if(c > max) max = c;
        if(d > max) max = d;
        return max;
    }
}