본문 바로가기
TIL

250402 TIL | 카펫 문제 풀기

by 23g 2025. 4. 2.

오늘은 적을게 많이 없어서 노서식으로~

 

< 오늘의 한 일 >

- 문법 다시 훑어보기

- 스위프트 헷갈리는 용어 정리

- 프로그래머스 한 문제 풀기

 

프로그래머스 Lv.2 - 카펫 문제 풀었음!

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

맨 처음 코드

import Foundation

func solution(_ brown:Int, _ yellow:Int) -> [Int] {
    var width = 0
    var length = 0
    
    for i in 1...yellow{
        if i * i == yellow{
            width = ( brown + 4 ) / 4
            length = width
        } else {
            width = 2 * ( brown + 4) / 7
            length = width * 3/4
        }
    }
    return [width, length]
}

 

열심히 머리 굴려서 나름의 공식 도출해냄,,,그러고 짠 코드

완존 안습이여 ㄱ-

테스트 케이스는 통과했지만 제출하고 오답 파티라 다시 생각...

 

import Foundation

func solution(_ brown:Int, _ yellow:Int) -> [Int] {
  var width = 0
  var length = 0
  var num = brown + yellow
  
  // ( 가로 -2) * ( 세로 -2 ) = yellow
  // 가로 * 세로 = brown + yellow
  
  for i in 1...num{
    if num % i == 0{
      if (i - 2) * (num / i - 2) == yellow{
        width = i
        length = num / i
      }
    }
  }
  
  return [width, length]
}

 

제대로 된 수식 도출..~

을 기반으로 작성한 코드

 

문제점
: 값을 찾고 난 뒤에도 계속 반복문이 돌아가 비효율

O(n) 시간 걸림

 

정답처리는 되었지만 더 좋은 코드를 연구해보면~~

 

import Foundation

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

 

이렇게 풀면 복잡도 O(√n)이 됨..!

Int(sqrt(Double(yellow)))

을 잘 기억해두자~

그리고 값 찾으면 바로 리턴해버리기...~

 

그럼 안녕~~~