Kotlin/Algorithm Problems

<프로그래머스> 24.02.20 복습

re트 2024. 2. 21. 09:26
728x90

[카펫 - 이전에 풀었던 방법]

https://retry-thinksubox.tistory.com/4

제출 결과

 

요즘 문제들이 너무 풀리지 않아서 다시 이전에 풀었던 문제들을 좀더 리마인드하고 다른 사람들의 풀이도 참고하며 코틀린 문법을 더 활용하는 시간을 가지기 위해 복습 시간을 가지기로 했다.

 

그 첫번째는 카펫 문제다.

이전에는 전체에서 외부 테두리의 개수를 사각형 형태에 맞을 때 비교하는 식으로 완전탐색을 진행해서 값을 구했었다.

그 과정 속에서 for문if문이 사용되었고 이해하기 쉬운 흐름이었다.

 

하지만 분명 내부 사각형을 이용하는 방법이 있을 거라는 생각을 했었다.

물론 그 방법을 떠올리지 못 해서 위의 방법으로 제출을 하고 마무리를 했었지만...

이번에 그 방법을 사용해 풀어보기로 했다.

 

흐름은 비슷하게 잡힌다.

먼저 내부 직사각형이 직사각형의 형태를 가질 수 있는 높이를 찾고 정해진 내부 직사각형의 크기를 기준으로 외부 테두리의 개수를 구해보고 그것이 주어진 값과 동일한지 비교해본다.

내부 직사각형이 직사각형의 형태를 가질 수 있는 높이를 찾는데는 filter 함수를 사용했다.

1부터 yellow까지 돌면서 filter 함수를 사용하면 반환값으로 List<Int>가 나오더라

여기에 이어서 정해진 내부 직사각형의 크기를 기준으로 외부 테두리의 개수를 구해보고 그것이 주어진 값과 동일한지 비교할 때는 List<Int>를 받아서 first 함수를 사용했다.

first 함수를 사용한 이유는 List<Int>로 받은 값들 중에서 하나만 선택하기 위해서와 카펫의 가로길이가 세로길이와 같거나 길다는 제한 사항때문인 걸로 느껴진다.

List에 들어있는 값은 작은 숫자부터 들어가 있어서 가로가 더 긴 직사각형부터 체크하기 때문이다.

이렇게 구한 숫자 하나를 가지고 let 함수를 써서 최종 결과값을 반환한다.

let 함수는 내부 블록의 마지막 코드를 반환하니까 intArrayOf를 사용해 바로 return 되도록 한다.

 

확실히 코드의 길이는 이전에 풀었던 방식과 비교하면 짧다.

하지만 약간 이해가 어렵긴 했다.

그리고 걸리는 시간도 두 코드가 차이가 있었다.

이전 방식은 시간이 고르게 걸려서 9~13ms 정도였는데 지금 방식은 짧게 걸릴 때는 엄청 짧게 걸리고 길때는 이전 방식보다 2~3배 걸린다.

이런 결과를 보면서 확실히 스코프 함수만 많이 쓴다고 좋은 결과를 무조건 얻을 수 있는 건 아니라는 생각이 들었다.

잘 섞어서 쓰고 다른 사람들이 봐도 이해하기 쉬운 코드를 짜야겠다는 결론이 났다.(당연한 말)

 

해당 방법으로 작성한 코드는 다음과 같다.

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) }
    }
}
반응형