멀쩡한 사각형

nelljun_kim·2022년 3월 22일
0

코딩테스트

목록 보기
8/8

처음 풀이

public long solution(int w, int h) {
    //가로로 한칸씩 움직이면서 대각선이 지나는 위치(y좌표)를 보고
    //지나가는 사각형의 개수를 계속 더해준다.
 
    //각 구간의 처음 지나가는 사각형의 위치
    //현재 대각선의 y좌표가 2.5라면 2 이후의 사각형부터 지나간다.
    int prevFlr = 0;
    int sumOfUnUsedSqr = 0;
    double division = h/(double)w;
 
    for(int i=1; i<=w; i++) {
        //한 칸 이동한 후 대각선의 y좌표를 포함한 사각형서부터
        //시작 위치 사각형까지 빼주면 한 칸 이동할 때 지나간 사각형의 개수다.
        sumOfUnUsedSqr += Math.ceil((division*i)-prevFlr;
        prevFlr = (int)Math.floor(division*i);
    }//for end
 
    return w*(long)h - sumOfUnUsedSqr;
}//solution() end

결과를 보니 테스트 6만 빼고 모두 통과했다.

바꾼 풀이

어디서 틀렸을까 고민하다가 자바에서 실수에 대한 연산은 정확하지 않다는 조언을 보고, division을 구하고 i를 곱하는 것이 아니라 i를 곱하고 w를 나누는 것으로 바꾸었다.

    public long solution(int w, int h) {
        int prevFlr = 0;
        int sumOfUnUsedSqr = 0;
 
        for(int i=1; i<=w; i++) {
            sumOfUnUsedSqr += Math.ceil((long)h*i/(double)w)-prevFlr;
            prevFlr = (int)Math.floor((long)h*i/(double)w);
        }//for end
 
        return w*(long)h - sumOfUnUsedSqr;
    }//solution() end
profile
세상을 다양하게 하는 개발자

0개의 댓글