본문 바로가기
프로그래머스 Algorithm

[프로그래머스] 카펫 Kotlin

by Echung 2023. 12. 11.

안녕하세요. 이번에는 프로그래머스 카펫 문제를 풀어보려고 합니다.

 

프로그래머스

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

programmers.co.kr


Problem

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

사진 1. 그림

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해 주세요.

 

[제한 사항]

갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.

노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.

카펫의 가로길이는 세로 길이와 같거나세로 길이보다 깁니다.

사진 2. 입출력 예

Solution

class Solution {
    fun solution(brown: Int, yellow: Int): IntArray {
        var answer = intArrayOf()
        
        var sum = brown + yellow
        
        for (h in 3..sum) {
            var w = sum / h
            var row = w * 2 + 2 * (h - 2)
            var col = (h - 2) * (w - 2)

            if(brown == row && yellow == col) {
                answer += w
                answer += h
                break
            }
        }
        
        return answer
    }
}

 이번 문제는 테두리는 브라운, 중앙은 노란색을 하기 위해서 기본적으로 i를 3으로 시작하도록 하였습니다. 왜냐하면 i가 2이면 중앙에 노란색을 할 수 없기 때문입니다.  그리고 row값과 col값을 구하는 식을 작성하였습니다. 

 

row 구하는 식

row는 맨 위와 맨 아래는 모두 브라운이기 때문에
w * 2

그다음 가운데는 양쪽 끝에만 브라운이기 때문에
2개에 맨 위 맨 아래를 제외한 높이를 곱해주면 됩니다.
2 * (h - 2)

최종식
var row = w * 2 + 2 * (h - 2)

 

col 구하는 식

col는 맨 위와 맨 아래를 제외해야 되기 때문에
(h - 2)

그리고 양쪽 끝을 제외한 가운데는 다 노란색이기 때문에
(w - 2)

최종식
var col = (h - 2) * (w - 2)

 으로 코드를 작성하여 문제를 해결하였습니다.

 

1. 다른 사람 코드

class Solution {
    fun solution(brown: Int, yellow: Int): IntArray {
        return (1..yellow)
            .filter { yellow % it == 0 }
            .first { brown == (yellow / it * 2) + (it * 2) + 4 }
            .let { intArrayOf(yellow / it + 2, it + 2) }
    }
}

  저의 코드와 다르게 Kotlin 스럽게 해결한 문제를 공부용으로 가져와보았습니다. 코드를 한번 분석해 보겠습니다.

 

코드 분석

class Solution {
    fun solution(brown: Int, yellow: Int): IntArray {
        return (1..yellow)
	        // filter을 통해서 yellow 격자를 다 사용 가능한지 체크해 줍니다.
            .filter { yellow % it == 0 }
            // first를 통해서 yellow / it * 2는 yellow가 들어가는 가운뎃줄의 양쪽 테두리를 구하는 코드입니다.
            // it * 2는 yellow 위아래는 테두리입니다.
            // 4는 사각형 꼭짓점의 수입니다.
            .first { brown == (yellow / it * 2) + (it * 2) + 4 }
            // let을 통해서 brown의 수는 yellow / it + 2와 yellow의 수는 it + 2을 출력해줍니다.
            .let { intArrayOf(yellow / it + 2, it + 2) }
    }
}

Performance

1. 내가 작성한 코드 2. 다른 사람 코드
반응형