[Swift] [38일차] 카펫

·2025년 1월 14일
0

SwiftAlgorithm

목록 보기
41/105
post-thumbnail

programmers-카펫

문제 설명


1. 그림처럼 테두리 한줄이 갈색으로 주어지고
2. 내부 노른자 부분은 노란색으로 칠해진다고 할 때
3. brown, yellow 타일수가 주어졌을 때 이게 어떤 정,직사각형인지 너비 높이 구하면 끝!


문제 접근

  1. 일단 한줄이 주어진다고 했으니까 한줄을 구하자면은
  2. 2width + 2hight - 4 가 갈색의 타일 수 겠구나 하면서 출발을 했다. (-4는 너비랑 높이를 곱하기하는과정에서 사각에 해당하는 4개의 타일)
  3. 노른자는 이제 테두리 한줄을 없애는거니까 양변에 해당하는 -2 ,-2 를 각각 너비,높이에서 빼준걸 곱한 형태이다 (width-2)*(height-2)

문제풀이 (정리하면..)

  1. Brown = 2W+2H-4
  2. Yellow = `(W-2)*(H-2)
    두개의 방정식을 잘 활용하면 될 것 같다 !

일단은 나온대로 해당 내용을 검증함수로 만들어줬다.

func isFine(_ brown: Int, _ yellow: Int, _ width: Int, _ height: Int) -> Bool {
    return (width*2 + height*2 - 4) == brown && (
        width*2 + height*2 - 4
    ) == yellow && width >= height
}

다음에는 조금 고군분투했던게,, 어찌보면 당연한게, 이 방정식을 계산하려면 어떻게 해야하지? 싶었다.

width,height를 뭐 숫자없이 선언하자니 웃기고, 그렇다고 1로 초기화하는건 아닌것같고,,하다가 for문으로 하나씩 대입해주는 방식으로 해결하고자했다.

이제 FOR문의 범위를 정해야하는데,,,
1. brown이 결국 2W+2H-4 에 해당하니까 결국 brown/2정도까지는 넉넉한 범위라고 생각했다.
2. height는 최소 네모크기가 3,3이니까 3부터 높이까지로해서 for문을 돌려주었다.

import Foundation

func isFine(_ brown: Int, _ yellow: Int, _ width: Int, _ height: Int) -> Bool {
    return (width * 2 + height * 2 - 4) == brown && (
        (width - 2) * (height - 2)
    ) == yellow && width >= height
}

func solution(_ brown: Int, _ yellow: Int) -> [Int] {
    for i in stride(from: brown / 2, through: 3, by: -1) {
        for j in 3 ... i {
            if isFine(brown, yellow, i, j) {
                return [i, j]
            }
        }
    }
    return []
}

채점 결과

정확성: 100.0
합계: 100.0 / 100.0

엄청 예전에 풀었던게 기억이 났는데, 그때는 답을보고도 왜 -4지 ?하면서 이해가 안됐었던 것 같은데, 이제는 알아서 풀리는걸 보니 그때보다는 좀 나아졌구나 싶다..


타인의 코드

import Foundation

func solution(_ brown: Int, _ red: Int) -> [Int] {
    for n in (1...Int(sqrt(Double(red)))).reversed() {
        if (red/n+2) * (n+2) == (brown + red) {
            return [(red/n+2), n+2]
        }
    }
    return [0, 0]
}
  1. 내가 지금까지 본 정답코드 중에 제일 좋았던 것 같다.
  2. (W-2) * (H-2) = YELLOW이라는 관계를 포착했지만, 이걸 반대로 생각하면,
  3. 결국 우리가 찾고자 하는 것은 전체 박스의 크기 W * H라서,
  4. yellow의 약수를 찾으면, 이 약수 쌍이 (W-2)(H-2)에 대응된다는 것이다 !!
    • W = a + 2
    • H = b + 2
      로 계산할 수 있다.
  5. 전체 타일의 크기 W * H(brown + yellow)와 일치하는지 검증하면 이제 답을 찾을 수 있다.

profile
기억보단 기록을

0개의 댓글