상세 컨텐츠

본문 제목

[Kotlin] 카펫

알고리즘 공부

by 독서와 여행 2021. 4. 28. 13:36

본문

내가 이해한 바로는 일단

면적을 최소화? 해야한다고 이해했다. 그런데 이렇게 해버리면 (18,6)이 주어졌을 때 아래와 같이 출력되지 않는다.

BBBBBBBB
BRRRRRRB
BBBBBBBB

 

왜냐하면 RRR

            RRR  이렇게 배치가 되기 때문에 뭐 이렇게 붕 뜨게 된다. 또 문제를 제대로 이해하지 않고 내 맘대로 문제를                 풀어 버렸다.

BBBBBB

B RRR B

B RRR B

B       B

BBBBBB

 아래의 코드를 버리고 그럼 새 코드를 짜봐야겠다. 완전 알고리즘이 달라질듯 하다.

fun solution(brown: Int, yellow: Int): IntArray { // yellow -> 가로 x 세로 , brown -> 가로 *2 + (세로 -2)*2
    var answer = IntArray(2)
    var yellow_horizon : Int = 0   // 옐로 가로 몫
    var yellow_vertical : Int = 0// 옐로 세로 나머지
    var min_difference : Int =  10000 // 만약 yellow 200 이면 for 문 돌면서 20 10 이 아니라 100 2 이렇게 바뀔 수 도 있어서 최소인 경우 찾아야함
    var tempt : Int // 갈색에서 임시로 사용하게 될 값
    for (i in 1..yellow - 1){ // yellow 1인 경우 예외처리 해야함
        if (yellow % i == 0  && i - yellow / i > 0 && i - yellow / i  < min_difference){
            yellow_horizon = i 
            yellow_vertical = yellow / i
            min_difference =  yellow_horizon - yellow_vertical
        }
        if (i > yellow / 2) break // 나누는 수가 yellow / 2 이상이면 의미 없음 가로가 무조건 더 길어야 하기 때문 3을 2로 나누거나 4를 3, 100을 51로 나눈다고 생각해보면 컷 해야함
    // yellow 가로 세로
    }
    if( yellow == 1 ){ 
        yellow_horizon = 1
        yellow_vertical = 1
    }
    println("노랑 가로 = $yellow_horizon")
    println("노랑 세로 = $yellow_vertical")

    min_difference = 1000 // 갈색에서도 써야하니까 일단 다시 초기화 
    for (i in yellow_horizon + 2 .. brown/2){
        tempt = (brown - i*2) / 2 + 2// 임시 갈색 세로 길이
        // println("일단 tempt 다 출력 $tempt")
        if ( i >= tempt && i  - tempt < min_difference && i* 2 + tempt *2 - 4 == brown){ // 가로가 세로보다 길고 현재 세로 가로 길이 차가 더 작아지고, 갈색 조건 만족
            // println("조건 만족한 임시 갈색 세로 길이 $tempt")
            answer[0] = i
            answer[1] = tempt
            min_difference = answer[0] - answer[1]
        }    //pass
    }
    println("나 끝났다")

    answer.forEach{print(it)}

    


    return answer
} 

 

수업 끝나고 얼른 다시 짠 다음 수정해야지.

 

풀었다~ 

class Solution {

fun solution(brown: Int, yellow: Int): IntArray { // yellow -> 가로 x 세로 , brown -> 가로 *2 + (세로 -2)*2
    var answer = IntArray(2)
    var yellow_horizon : Int   // 옐로 가로 몫
    var yellow_vertical : Int // 옐로 세로 나머지
    for (i in 1..yellow - 1){ // yellow 1인 경우 예외처리 해야함
        if (yellow % i == 0 ){
            yellow_horizon = yellow / i  // horizon이 더 길어야 하고  6 / 2 = 3 이 6/3 = 2 보다 빨리 나옴
            yellow_vertical = i
            if((yellow_horizon + 2) * 2 + yellow_vertical * 2  == brown) {
                answer[0] = yellow_horizon + 2
                answer[1] = yellow_vertical + 2
                return answer
            } 
        }  
    }
    if (yellow == 1) { //앞에 for문에 안들어감 따로 예외처리 해주자
        answer[0] = 3
        answer[1] = 3
        return answer
    }

    return answer // 코틀린은 a 'return' expression required in a function with a block body ('{...}') 오류를 일으킨다.
 } 
}

'알고리즘 공부' 카테고리의 다른 글

[Python] 프린터  (0) 2021.04.20
[Kotlin] 기능개발  (0) 2021.04.19
[Kotlin] 키패드 누르기  (0) 2021.04.18
[Python] 실패율  (0) 2021.04.16
[Python] [Kotlin]프로그래머스 - 내적  (0) 2021.04.14

관련글 더보기

댓글 영역