# Algorithm/--- 프로그래머스

[프로그래머스] 카펫 with Swift, Python

jiniz.ll 2022. 6. 30. 16:30

 

문제

  • 테두리 한 줄은 갈색
  • 중앙은 노란색 카펫

 

  • 갈색 격자 수, 노란색 격자 수가 주어질 때
  • 가로, 세로 크기를 반환

 

  • 갈색 수 : 8 이상 5000 이하
  • 노란색 수 : 1 이상 2,000,000 이하
  • 가로 길이 >= 세로 길이

 

Idea

  • 갈색은 테두리 1줄이므로 갈색 격자 수 나누기 2를 하면 가로 + 세로 -2 값이 됨 
  • 갈색 격자 수 / 2 + 2 → 가로 + 세로

 

  • 풀이 1
  • 또한 중간에 노란색 줄이 1개라도 들어가야 하므로 갈색 테두리 길이는 세로와 가로 모두 최소 3의 값을 갖게 됨
  • 이때 세로가 더 작거나 같으므로 세로를 3부터 시작해서 가로, 세로 조합을 구할 수 있음
  • 또한 그에 따른 노란색의 가로, 세로길이는 (갈색 가로-2, 갈색 세로-2)이므로 노란색의 가로x세로의 값을 비교하여 적합한 갈색의 길이 구하기
  • 풀이 2
  • 또는 갈색의 가로x세로 연산으로 면적을 구한다음, 갈색 격자 수를 빼기
  • 그러면 노란색의 격자 수가 나오는데 그 값이 주어진 노란색 격자 수와 동일한지 비교하여 올바른 길이를 구할 수 있음

 

Code

Swift

  • 풀이 1 로 구현
import Foundation

func solution(_ brown:Int, _ yellow:Int) -> [Int] {
    
    let brown_half = brown / 2 + 2
    var col = 3
    var row = brown_half - col
    while col <= row {
        let (y_row, y_col) = (row-2, col-2)
        if y_row * y_col == yellow { break }
        col += 1
        row -= 1
    }
    
    return [row, col]
}

 

Python

  • 풀이 2로 구현
def solution(brown, yellow):
    answer = []
    
    len = brown // 2 + 2
    for col in range(1, len // 2 + 1):
        row = len - col
        yellowArea = row * col - brown
        if yellow == yellowArea:
            answer = [row, col]
            break
    
    return answer