sggnology
하늘속에서IT
sggnology
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • Algorithm (31)
      • Programmers (27)
      • Baekjoon (4)
    • WIKI (4)
      • VirtualBox (1)
      • Power Toys (1)
    • NodeJS (4)
      • nvm (1)
      • React (1)
      • Vue (1)
    • Dev Language (3)
      • Java (2)
      • Kotlin (1)
    • Spring Boot (17)
      • Gradle (1)
      • JPA (3)
    • DB (4)
      • MariaDB (3)
      • Redis (0)
    • Android (6)
      • Debug (3)
    • Nginx (3)
      • Debug (1)
    • Intellij (0)
    • Network (1)
    • Git (2)
      • GitHub (2)
    • Chrome Extension (0)
    • ETC (5)
      • Monitoring (2)
    • Linux (1)
      • WSL (1)
    • Visual Studio (1)
    • Side Project (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 고득점 Kit
  • docker
  • 백준
  • JPA
  • 안드로이드 스튜디오
  • 레벨2
  • 오블완
  • 레벨3
  • Android Studio
  • java
  • DB
  • nginx
  • 티스토리챌린지
  • spring boot
  • kotlin
  • 고득점KIT
  • mariadb
  • 알고리즘
  • 연습문제
  • 프로그래머스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
sggnology

하늘속에서IT

Programmers :: Summer/Winter Coding(2019) :: 멀쩡한 사각형
Algorithm/Programmers

Programmers :: Summer/Winter Coding(2019) :: 멀쩡한 사각형

2022. 8. 4. 22:51
728x90

문제 설명 이미지

 

풀이

package programmers.summerwinter

import kotlin.math.ceil
import kotlin.math.floor

/**
 * 설명
 * - 프로그래머스 > Summer/Winter Coding(2019) > 멀쩡한 사각형
 * - 경로 : https://school.programmers.co.kr/learn/courses/30/lessons/62048
 *
 * */

class FineSquare {
    /**
     * 설명
     * - 문제에서는 왼쪽위에서 아래 대각선으로 가로지르는데 이는 왼쪽 아래 즉,[0,0](좌표)에서 시작해서 오른쪽 위까지 가로지르는 것과 같은 결과값을 가진다.
     * - 기울기: h/w, 인 1차 방정식 그래프를 그릴 수 있다는 것을 알 수 있다.
     * - 그림을 보았을 때, y 값이 int 인 좌표지점에서 작은 사각형(sub square)이 그려지는 것을 알 수 있다.
     * - 정답 : (작은 사각형 내부의 사이즈 - 작은 사각형을 지나는 사각형의 수) * 전체 사각형의 길이(w)/작은 사각형의 x 좌표 (작은 사각형의 개수)
     * */
    fun solution(w: Int, h: Int): Long{
        // 모든 사각형의 개수
        val allSquareCounts:Long = w*h.toLong()

        // y 값이 int 인 첫번째 좌표를 위한 변수
        val firstFineCoordinate = mutableListOf<Int>()

        /**
         * 설명
         * - y 값이 int 인 첫번째 좌표를 찾기 위한 동작
         *
         * 흐름
         * - 시작지점이 [0,0](좌표)임으로, 1부터 작은 사각형을 찾는다.
         * */
        for(x in 1 ..w){

            val equationResult = equation(w, h, x)

            if(isInt(equationResult)){
                firstFineCoordinate.add(x)
                firstFineCoordinate.add(equationResult.toInt())
                break
            }
        }

        // 작은 사각형의 총 개수
        val subSquareCounts = w / firstFineCoordinate[0]

        // 작은 사각형 내부의 가로질러지는 사각형의 개수
        var subSquareCrossedSquareCounts = 0;

        /**
         * 설명을 위한 변수
         * - 작은 사각형 좌표 [w', h']
         *
         * 설명
         * - x 좌표는 양의 정수임으로 0..w 까지이다.
         * - 작은 사각형의 크기는 (1*h')*w'
         * - 즉, x 좌표의 제일 작은 단위인 `1`마다 지나는 값을 구해줄 것이다.
         *
         * 예시
         * - 기울기가 3/2 인 그래프가 있다고 할때 제일 작은 사각형의 첫번째로 만나는 y 값이 int 인 좌표는 [2,3]이다.
         * - 해당 기울기의 그래프가 지나는 좌표는 다음과 같다, [0,0], [1,3/2], [2,3]
         * - 제일 작은 단위 기준에서 보자면, [0,0], [1,3/2] 이다.
         * - 이 때, 우리는 제일 작은 단위 기준에서 3/2이 1와 2 사이를 지나는 것을 알 수 있다.
         * - 즉, 제일 작은 단위에서 2개의 작은 사각형을 지난다는 것을 알 수 있다.
         * - 결과로 도출된 것을 식으로 표현하자면
         * - 식 : 3/2 의 높임처리(ceil) - 0 의 낮음처리(floor), 이다.
         * */
        for(subSquareX in 1 .. firstFineCoordinate[0]){
            // 작은 사각형에서 제일 작은 단위일때 가로질러지는 사각형의 개수
            val subSquareSingleUnitSize = ceil(equation(w, h, subSquareX)) - floor(equation(w, h, subSquareX - 1))
            subSquareCrossedSquareCounts += subSquareSingleUnitSize.toInt()
        }

        // 작은 사각형 내부에서 가로질러지는 모든 사각형의 개수
        val crossedSubSquareCounts = subSquareCrossedSquareCounts * subSquareCounts

//        println(crossedSubSquareCounts)
//        println(allSquareCounts - crossedSubSquareCounts)

        // 가로질러지지 않은 사각형의 모든 개수
        val notCrossedSquareCounts = allSquareCounts - crossedSubSquareCounts

        return notCrossedSquareCounts
    }

    fun equation(w: Int, h: Int, x: Int): Double {

        return x*h.toDouble()/(w.toDouble())
    }

    fun isInt(cmpNum: Double): Boolean{

        if(ceil(cmpNum) == floor(cmpNum)){
            return true
        }

        return false
    }

//    /**
//     * 자료형으로 인한 오류의 종류 1
//     * - 6번 테스트의 경우 에러가 발생한다.
//     * */
//    fun solution(w: Int, h: Int): Long{
//        val allSquareCounts:Long = w*h.toLong()
//
//        val firstFineCoordinate = mutableListOf<Int>()
//
//        /**
//         * 오류
//         * - 정확히는 모르겠으나, 자료형에 의한 오류로써 coefficient(계수) 를 구하고 방정식 값을 구하고자 하면 에러가 난다.
//         * (근데 자료형 오류면 런타임 에러라도 뱉어줘야 하는거 아닌가..)
//         * */
//        val coefficient = getCoefficient(w, h)
//
//        for(x in 1 ..w){
//
//            val equationResult = equation(coefficient, x)
////            val equationResult = equation(w, h, x)
//
//            if(isInt(equationResult)){
//                firstFineCoordinate.add(x)
//                firstFineCoordinate.add(equationResult.toInt())
//                break
//            }
//        }
//
//        val subSquareCounts = w / firstFineCoordinate[0]
//
//        var subSquareCrossedSquareCounts = 0;
//
//        for(subSquareX in 1 .. firstFineCoordinate[0]){
//            val subSquareSingleUnitSize = ceil(equation(coefficient, subSquareX)) - floor(equation(coefficient, subSquareX - 1))
////            val subSquareSingleUnitSize = ceil(equation(w, h, subSquareX)) - floor(equation(w, h, subSquareX - 1))
//            subSquareCrossedSquareCounts += subSquareSingleUnitSize.toInt()
//        }
//
//        val crossedSubSquareCounts = subSquareCrossedSquareCounts * subSquareCounts
//
//        val notCrossedSquareCounts = allSquareCounts - crossedSubSquareCounts
//
//        return notCrossedSquareCounts
//    }
//
//    fun equation(coefficient: Double, x: Int): Double {
//
//        return x*coefficient
//    }
//
//    fun getCoefficient(w: Int, h: Int): Double{
//        return h/w.toDouble()
//    }
//
//    fun isInt(cmpNum: Double): Boolean{
//
//        if(ceil(cmpNum) == floor(cmpNum)){
//            return true
//        }
//
//        return false
//    }

//    /**
//     * 자료형으로 인한 오류의 종류 2
//     * - 6번은 해결되나 13, 15~17 번에서 에러가 발생한다.
//     * */
//    fun solution(w: Int, h: Int): Long{
//        val allSquareCounts:Long = w*h.toLong()
//
//        val firstFineCoordinate = mutableListOf<Int>()
//
//        for(x in 1 ..w){
//            /**
//             * 오류
//             * - 정확히는 모르겠으나, equation 함수내에서 값을 구할 때 x*h/w.toDouble() 하는데 h 에 toDouble 해주지 않아서 에러가 발생한다.
//             * (근데 자료형 오류면 런타임 에러라도 뱉어줘야 하는거 아닌가..)
//             * (이정도 되면 의문이 드는게, 문제를 풀어냄과 동시에 자료형에 대한 이해 또한 있어야 한다는 건가)
//             * (일단 w,h 가 1억 이하 라는걸 보고 쉽게 정답이 나오지 않을걸 알았지만 이정도 일줄이야..)
//             * */
//            val equationResult = equation(w, h, x)
//
//            if(isInt(equationResult)){
//                firstFineCoordinate.add(x)
//                firstFineCoordinate.add(equationResult.toInt())
//                break
//            }
//        }
//
//        val subSquareCounts = w / firstFineCoordinate[0]
//
//        var subSquareCrossedSquareCounts = 0;
//
//        for(subSquareX in 1 .. firstFineCoordinate[0]){
//            val subSquareSingleUnitSize = ceil(equation(w, h, subSquareX)) - floor(equation(w, h, subSquareX - 1))
//            subSquareCrossedSquareCounts += subSquareSingleUnitSize.toInt()
//        }
//
//        val crossedSubSquareCounts = subSquareCrossedSquareCounts * subSquareCounts
//
//        val notCrossedSquareCounts = allSquareCounts - crossedSubSquareCounts
//
//        return notCrossedSquareCounts
//    }
//
//    fun equation(w: Int, h: Int, x: Int): Double {
//
//        return x*h/w.toDouble()
//    }
//
//    fun isInt(cmpNum: Double): Boolean{
//
//        if(ceil(cmpNum) == floor(cmpNum)){
//            return true
//        }
//
//        return false
//    }
}

출처

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 풀이 코드

 

GitHub - sggnology/programmers-algorithm: 프로그래머스 알고리즘 코드 정리입니다.

프로그래머스 알고리즘 코드 정리입니다. Contribute to sggnology/programmers-algorithm development by creating an account on GitHub.

github.com

 

728x90

'Algorithm > Programmers' 카테고리의 다른 글

Programmers :: 2022 tech internship :: 두 큐 합 같게 만들기  (0) 2022.08.30
Programmers :: 2021 카카오 채용연계형 인턴십 :: 거리두기 확인하기  (0) 2022.08.16
Programmers 동적계획법 :: 레벨3 :: N 으로 표현  (0) 2022.07.26
Programmers DFS/BFS :: 레벨 2 :: 게임 맵 최단거리  (0) 2022.07.20
Programmers 완전탐색 :: 레벨2 :: 카펫  (0) 2022.07.19
    'Algorithm/Programmers' 카테고리의 다른 글
    • Programmers :: 2022 tech internship :: 두 큐 합 같게 만들기
    • Programmers :: 2021 카카오 채용연계형 인턴십 :: 거리두기 확인하기
    • Programmers 동적계획법 :: 레벨3 :: N 으로 표현
    • Programmers DFS/BFS :: 레벨 2 :: 게임 맵 최단거리
    sggnology
    sggnology
    하늘은 파란색이니까 내 삶도 파란색이길 ㅎㅎ

    티스토리툴바