[S/W 문제해결 기본] 1일차 - View

soluinoon·2022년 10월 25일
0

알고리즘 저지

목록 보기
1/13
post-custom-banner

1. 문제정보

1.1 링크

문제링크
https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AV134DPqAA8CFAYh&categoryId=AV134DPqAA8CFAYh&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&selectCodeLang=ALL&select-1=3&pageSize=10&pageIndex=1

1.2 문제요약

쉬운 비교문제입니다. 왼쪽 2칸, 오른쪽 2칸 검사해서 크기차이를 구하면 됩니다.

2. 문제풀이

2.1 접근법

2.1.1 조망권

public static int checkLeft(int[] buildings, int index) {
        int gap1, gap2;
        int res;
             
        gap1 = buildings[index] - buildings[index - 1];
        gap2 = buildings[index] - buildings[index - 2];
         
        if (gap1 > gap2)
            res = gap2;
        else
            res = gap1;
        if (res < 0)
            return 0;
        return res;
         
    }

왼쪽, 오른쪽 나눠서 검사합니다.
왼쪽을 기준으로 말씀드리면, 왼쪽 2칸을 각각 기준 빌딩과 차이를 구합니다. 더 작은 차이가 결국 조망권이 확보된 세대겠죠? 이걸 이제 오른쪽에서도 구해서 비교한 뒤에, 더 작은 값을 조망권이 확보된 세대로 정합니다.

2.2 전체코드

import java.util.*;
import java.io.*;
 
class Solution
{
    public static void main(String args[]) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int building;
        int view;
        int[] buildings;
         
        for(int test_case = 1; test_case <= 10; test_case++)
        {
            building = Integer.parseInt(br.readLine());
            buildings = new int[building + 4];
            view = 0;
            // input
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < building; i++) {
                buildings[i] = Integer.parseInt(st.nextToken());
            }
             
            // logic
            for (int i = 2; i <= building - 2; i++) {
                view += getView(buildings, i);
            }
             
            System.out.println("#" + test_case + " " + view);
        }
    }
     
    public static int getView(int[] buildings, int index) {
        int res;
        int left = checkLeft(buildings, index);
        int right = checkRight(buildings, index);
         
        if (left < right)
            res = left;
        else
            res = right;
         return res;
    }
     
    public static int checkLeft(int[] buildings, int index) {
        int gap1, gap2;
        int res;
             
        gap1 = buildings[index] - buildings[index - 1];
        gap2 = buildings[index] - buildings[index - 2];
         
        if (gap1 > gap2)
            res = gap2;
        else
            res = gap1;
        if (res < 0)
            return 0;
        return res;
         
    }
     
    public static int checkRight(int[] buildings, int index) {
        int gap1, gap2;
        int res;
             
        gap1 = buildings[index] - buildings[index + 1];
        gap2 = buildings[index] - buildings[index + 2];
         
        if (gap1 > gap2)
            res = gap2;
        else
            res = gap1;
        if (res < 0)
            return 0;
        return res;
    }
}

3. 결론

삼성은 난이도가 같아도 차이가 심하네요.

profile
수박개 입니다.
post-custom-banner

0개의 댓글