본문 바로가기
코딩테스트

[프로그래머스][Lv.2] 완전탐색 - 카펫 (Swift)

by Jimmy_iOS 2023. 6. 26.

문제 설명

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

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

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

 

제한사항
  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
입출력 예
brown yellow return
10 2 [4, 3]
8 1 [3, 3]
24 24

 

문제 해석

단서

(1) yellow타일은 중앙에 있으므로 yellow타일을 통해 brown타일의 갯수를 추론할 수 있다.

(2) yellow타일의 가로*2 + 세로*2 + 4(각 모서리)의 합은 brown의 타일 갯수이다.

 

알고리즘 

(1) 반복문을 사용해 yellow타일의 약수를 구한다. (약수를 구할 때 제곱근을 활용하여 시간복잡도 O(n)에서 O(√n)으로 줄여준다)

 

코드

func solution(_ brown:Int, _ yellow:Int) -> [Int] {

    for column in 1...Int(sqrt(Double(yellow))) {
        if yellow % column == 0 {
            let row = yellow/column
            let brownHab = column*2 + row*2 + 4
            if brownHab == brown {
                return [row + 2, column + 2]
            }
        }
    }
    return []
}

여기까지가 내 풀이고 GPT는 어떻게 푸는지 궁금해서 한번 물어봤다.

비슷하게 약수를 구해서 풀었지만 시간복잡도 O(n)을 사용해서 sqrt()를 사용해서 다시 풀어달라고 해봤다.

 

func solution(_ brown:Int, _ yellow:Int) -> [Int] {
    let sum = brown + yellow
    for i in 1...Int(sqrt(Double(sum))) {
        if sum % i == 0 {
            let j = sum / i
            if (i - 2) * (j - 2) == yellow {
                return [j, i]
            }
        }
    }
    return []
}

내가 푼 답과 굉장히 유사한 풀이를 제공했는데

GPT는 나와 다르게 brow타일과 yellow타일의 합에서 약수를 구해서 풀었다.

 

아래는 GPT가 제공한 코드 풀이

함수 solution은 brown과 yellow라는 두 개의 파라미터를 받습니다. brown은 갈색 격자 수이고, yellow는 노란색 격자 수입니다.

함수는 2차원 직사각형 형태의 카펫을 만들어야 하며, 이때 주어진 갈색 격자 수와 노란색 격자 수를 이용하여 카펫의 가로와 세로 길이를 찾아내야 합니다.

함수 내부에서는 먼저 갈색 격자와 노란색 격자의 수를 더하여 sum 변수에 할당합니다.

그 다음, 1부터 sum의 제곱근까지의 범위에서 i를 반복합니다.

sum을 i로 나누어 나머지가 0인 경우, j를 sum을 i로 나눈 값으로 할당합니다. i와 j는 각각 카펫의 가로와 세로 길이를 의미합니다.

이후, (i - 2) * (j - 2) == yellow를 만족하는 경우, 즉 노란색 격자의 수가 yellow와 같은 경우, [j, i]를 반환합니다.

반복문이 끝난 후, 만약 카펫의 크기를 찾지 못한 경우 빈 배열을 반환합니다.