Lv 2. 멀쩡한 사각형

2024. 9. 8. 22:30·Algorithm & Data Structures/Programers

 

처음 코드는 부동소수점으로 인해서 오차가 발생하여 오답이 나버렸다.

두번째 코드는 부동소수점의 오류를 보완하고 더 간결하게 해결한 코드이다.

부동소수점에 대해서 알 수 있는 좋은 기회였지만... 시간이 너무 걸렸다.

//규칙이 존재한다. 
// w  8 h  12 면
// 약분해서 2, 3 이되고 2,3 에서 규칙이 총 4번 반복
// 2,3에서 지워지는 사각형 갯수 * 4 가 답이다.
// 결론은 7 12 와 같이 좀 약분했을때 큰수가 들어오면
// 빡세다는건데
// 음
// 2 3 일때
// w가 1 이동하면 1.5 이동함
// w1 이동시 2개
// 시작점이 1.5니까 나누어 떨어지지않으니까 +1해서 2
// 총 4
// 4,5 일때 한번보면 
// 1 이동하면 1.2 2
// 1.25에서 1이동하면 2
// 2.5에서 1 이동하면 2
// 3.75에서 1 이동하면 2

// 찾았다. 
//     결론적으로. 
//     들어온 수 약분 해서 작은수 만들고
//     작은수에서 규칙 해가지고 약분한만큼 나온값 * 해버리면 끝

// 규칙 method가 본질
// 0,0 에서 w가 1씩 올라가면 올라갈 수록 
// 얼마나 오르는지 확인하고 숫자 변화 있으면 +2
// 변화 없으면 +1
// 시작점이 똑떨어지면 +1
import java.util.*;

class Solution {
    // 최대 공약수 method (유클리드 호제법 사용)
    public int findGcd(int w, int h){
        if (h == 0) return w;
        return findGcd(h, w % h);
    }

    // 규칙 찾기 method
    public int regular(int w, int h){
        double sp = 0, ep = 0;
        double plus = (double)h / (double)w;
        int result = 0;
        for(int i = 0 ; i < w ; i++){
            ep += plus;
            result += (int) Math.ceil(ep) - Math.floor(sp);
            sp = ep;
        }
        return result;
    }

    public long solution(int w, int h) {
        int gcd = findGcd(w, h);
        long totalArea = (long) w * h;
        int reducedW = w / gcd;
        int reducedH = h / gcd;
        int erasedSquares = regular(reducedW, reducedH);
        return totalArea - (long) erasedSquares * gcd;
    }
}

 

기하학에 의거 ((w / ref) + (h / ref) - 1) 이게 내가 위에서 열심히 작성했던 regular 함수에서 반환되는 값보다 정확하면서 간결하게 계산하는 코드이다..

class Solution
{
	public long solution(int w, int h)
	{
		long ref = gcd(w, h);
		return ((long) w * h) - (((w / ref) + (h / ref) - 1) * ref);
	}
	public int gcd(int w, int h)
	{	
        if(h == 0) return w;
        return gcd(h,w%h);
	}
}

'Algorithm & Data Structures > Programers' 카테고리의 다른 글

Lv 2. 광물 캐기  (0) 2024.09.10
Lv 2. 문자열 압축  (0) 2024.09.09
Lv 2. 가장 큰 정사각형  (4) 2024.09.06
Lv 2. 거리두기 확인하기  (0) 2024.09.05
Lv 2. 리코쳇 로봇  (0) 2024.09.04
'Algorithm & Data Structures/Programers' 카테고리의 다른 글
  • Lv 2. 광물 캐기
  • Lv 2. 문자열 압축
  • Lv 2. 가장 큰 정사각형
  • Lv 2. 거리두기 확인하기
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    오늘
    어제
    • 분류 전체보기 (335)
      • Algorithm & Data Structures (253)
        • BOJ (111)
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (29)
        • SQL (23)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • 네트워크 (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    algorithm
    알고리즘
    동적계획법
    유니온파인드
    PriorityQueue
    후위순회
    Dijkstra
    구현
    백준
    binarySearch
    dfs
    골드
    자바
    전위순회
    SQL
    경로압축
    Java
    다익스트라
    DynamicProgramming
    Union-Find
    dp
    스택
    프로그래머스
    baekjoon
    Stack
    programmers
    투포인터
    BFS
    백트래킹
    이분탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Geisha
Lv 2. 멀쩡한 사각형
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.