알고리즘/아이디어

프로그래머스_멀쩡한사각형_62048

ganzii 2020. 12. 29. 00:16

문제 링크

조건

  • W : 가로 길이, 1억 이하 자연수
  • H : 세로 길이, 1억 이하 자연수

 

접근 방법

  • 세로 길이를 기준으로 1cm씩 늘어날 때, 가로 길이는 어디서부터 어디까지 전진하는 지 확인
    • ex. 세로가 2일 때, 가로는 0.6 ~ 1.3만큼 전진함 => Math.floor(0.6) ~ Math.ceil(1.3) 까지의 범위만큼 격자가 잘려나감
  • 가로가 전진한 끝 지점(x)과 Math.ceil(x) 값이 같다면 정수로 나누어 떨어진다는 뜻 => 이후로는 같은 패턴 반복

주의 할 점
- 사칙 연산 순서 => '(double)w * i / h' 와 '(double)w / h * i'의 결과가 다를 수 있음, w/h 과정에서 분수값이 double형 소수로 바뀌면서 데이터 손실..? 발생할 수 있음
- w * h => answer 변수가 long타입이더라도 w * h int변수 끼리의 계산 과정에서 int 범위를 넘어가면 답이 틀림, long타입 형변환 필요

 

솔루션

class Solution {
    public long solution(int w, int h) {
        long answer;
        long cut = 0; // 잘려 나가는 격자 개수

        double s, e;

        for(int i = 0; i < h; i++){
            // 사칙연산 순서 중요..( w / h와 같이 나누기를 먼저 하면 분수값이 double형 소수로 환산되면서 정확도 떨어짐)
            s = Math.floor((double)w * i / h); 
            e = Math.ceil((double)w * (i+1) / h);

            cut += e-s;
            if(e == ((double)w * (i+1) / h)){ // 나누어 떨어지는 지점
                cut = (h/(i+1)) * cut;
                break;
            }

        }

        // long타입 형변환 필요 => w * h : int형끼리의 사칙연산은 int형으로 계산됨
        answer = (long)w * h - cut;

        return answer;
    }
}

 

리뷰

  • 잘한 점 : 기울기 개념을 접목시킴 (H값 증감을 기준으로 W값의 변화량을 확인)
  • 부족한 점 : int형 끼리의 사칙연산 시 int범위를 벗어날 수도 있는 점, 사칙연산의 순서에 따라 데이터의 손실이 발생할 수 있는 점 등 java의 기본 개념 복습 필요