본문 바로가기
Problem Solving

[Swift] 프로그래머스 카펫(lv. 2)

by DuncanKim 2023. 3. 9.
728x90

[Swift] 프로그래머스 카펫(lv. 2)

 

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42842

 

프로그래머스

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

programmers.co.kr

 

2. 접근

중앙에는 노란색으로 칠해져있고, 테두리는 갈색인 카펫이라고 했다.

그렇다면, 내부에는 정사각형이든 직사각형이고, 테두리는 1줄로 고정되어 있는 것이다.

 

그러면 전체 카펫 가로 세로 길이가 각각 x, y라고 한다면, 노란색 부분의 면적은 항상 (x - 2) * (y - 2) 가 된다.

그러면 한 칸의 길이를 1 * 1로 생각하고, 전체 칸의 개수를 가지고 탐색을 해보면 될 것이다.

 

sum을 인덱스로 나눈 값을 임의로 x, 인덱스를 y로 해준다. 가로 길이가 같거나 더 크기 때문이다.

(인덱스가 0부터 올라가기 때문에, 나누어지면 항상 x가 크게 되어있다. y가 더 커지기 전에 정답이 찾아진다.)

sum은 전체 넓이(카펫 칸의 개수)이므로, x * y는 항상 sum이다.

만약 sum이 i 즉, y로 나누어 떨어지지 않는다면, 적절한 가로 세로 길이가 아니기 때문에 지나가준다.

 

이것을 통과하고 (x - 2) * (y - 2) == yellow라면, 정답 길이를 찾은 것이다. 그러면 전체 카펫 가로 세로 길이인 [x, y]를 리턴해주면 된다. 

 

 

3. 코드

import Foundation

func solution(_ brown:Int, _ yellow:Int) -> [Int] {
    let sum = brown + yellow
    var x = 1
    var y = 1
    for i in 1 ... sum {
        if sum % i == 0 {
            x = sum / i
            y = i
        }
        if (x - 2) * (y - 2) == yellow {
            break
        }
    }
    return [x, y]
}
728x90

댓글