티스토리 뷰

PS

[Swift]프로그래머스_카펫

희철 2022. 4. 17. 00:03

문제 설명

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 [8, 6]

 

 

풀이

 

전체적인 구조를 설명하자면, 먼저 약수를 구하는 함수를 통해 yellow값의 약수를 구한다. 이때, yellow의 제곱근까지만 구하도록하여 yellow를 약수로 나눠 가로를 구할 때 세로보다 작아지지 않도록 해주었다. 

구한 약수가 담긴 배열의 원소로 하나씩 yellow를 나눠 가로와 세로를 구한 뒤, (가로 + 세로 + 2) * 2가 brown과 동일하다면 break를 통해 반복문을 빠져나온다. 

 

import Foundation

func solution(_ brown:Int, _ yellow:Int) -> [Int] {
    
    var result: [Int] = [0,0]
    var divisor: [Int] = []
    var width: Int = 0
    var height: Int = 0
    
    //약수 구하는 함수
    func getDivisor(_ number: Int) {
        
        var result: [Int] = []
                
        for i in 2...Int(sqrt(Double(number))) {
            if number % i == 0 {
                result.append(i)
            }
        }
        divisor = result
    }
    
    if yellow == 1 {
        result = [3, 3]
    } else if yellow == 2 {
        result = [4, 3]
    } else if yellow == 3 {
        result = [5, 3]
    } else {
        //약수 구하기
        getDivisor(yellow)
        if divisor.count == 0 {
            // 약수가 없으면 가로로만 쭉 나열한 경우밖에 없음
            result = [yellow + 2, 3]
        } else {
            for i in divisor {
                height = i
                width = yellow / i
                
                if brown == (height + 2 + width) * 2 {
                    result = [width + 2, height + 2]
                    break
                }
            }
        }
    }
    return result
}

 

결론

 

이번엔 검색을 하지않고 스스로 해결하긴했지만, 다른 분들의 코드와 비교해보았을 때 지금보다 더 짧게 작성이 가능했다. 접근 방식의 차이이긴하지만 내 코드는 조금 길어서 지저분해보이긴한다. 다음부터 조금 더 신경을 써보아야겠다.

완전탐색 문제들을 풀고있는데 조금 더 풀이를 빨리 생각해내기 위해서는 더 많이 풀어보아야 할 것 같다.

 

'PS' 카테고리의 다른 글

[Swift]프로그래머스_프린터  (0) 2022.04.19
[Swift]프로그래머스_기능개발  (0) 2022.04.18
[Swift]프로그래머스_H-Index  (0) 2022.04.17
[Swift]프로그래머스_가장 큰 수  (0) 2022.04.17
[Swift]프로그래머스_소수 찾기  (0) 2022.04.16
댓글
최근에 올라온 글
Total
Today
Yesterday