본문 바로가기
Algorithm/Python

[프로그래머스] 카펫

by _sweep 2022. 3. 5.

문제 링크 >> https://programmers.co.kr/learn/courses/30/lessons/42842

 

 

📋 문제

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

 

 

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

 

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

 

👉 출력

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

 

 

 

📝 풀이

❌ 첫 번째 풀이

def getDivisor(n):
  divisors = []
  
  for i in range(1, int(n**(1/2)) + 1):
    if n % i == 0:
      divisors.append([i, n//i])
      if i**2 != n:
        divisors.append([n//i, i])
  return list(filter(lambda x: x[0] >= x[1], sorted(divisors)))
  
def solution(brown, yellow):
    return getDivisor(brown+yellow)[0]

 

첫 번째 풀이는 약수를 이용하는 풀이였다.

brown + yellow로 총 격자의 수를 구하고 이 수의 약수 중 가로 길이가 세로 길이와 같거나 큰 것을 구하는 것이다.

그리고 구한 리스트 중 첫 번째 값을 출력하도록 했다.

 

뭔가 되지 않을까 했는데 아쉽게도 4, 6, 7번의 세 가지 테스트 케이스를 통과하지 못했다.

 

반례는 brown = 18, yellow = 6이 주어질 경우이다.

이 경우 내가 구한 답은 [6, 4]가 되는데 6x4의 타일에서는 문제에서 원하는 조건을 만족하지 못한다.

 

 

✔️ 두 번째 풀이

def getDivisor(n):
  divisors = []
  
  for i in range(1, int(n**(1/2)) + 1):
    if n % i == 0:
      divisors.append([i, n//i])
      if i**2 != n:
        divisors.append([n//i, i])
  return list(filter(lambda x: x[0] >= x[1], sorted(divisors)))
  
def solution(brown, yellow):
    arr = getDivisor(brown+yellow)
    for row, col in arr:
      if (row - 2) * (col - 2) == yellow:
        return [row, col]

 

테두리 1줄이 모두 갈색 격자이므로 노란색 격자가 1개일 때를 생각하면 아래와 같다.

 

 

노란색 격자를 감싼 형태가 되어야 하므로 row는 노란색 격자의 수보다 2개가 더 추가되어야 하고 column도 마찬가지로 2개가 더 추가되어야 한다.

따라서 row, column과 yellow 사이에는 (row - 2) * (column - 2) = yellow 라는 관계가 성립하게 된다.

 

이러한 변경 사항을 첫 번째 코드에 추가하니 원하는 답을 얻을 수 있었다.

 

 

 

 

 

'Algorithm > Python' 카테고리의 다른 글

[이코테] 모험가 길드  (0) 2022.03.09
[백준 18406번] 럭키 스트레이트  (0) 2022.03.09
[프로그래머스] 더 맵게  (0) 2022.03.04
[백준 7453번] 합이 0인 네 정수  (0) 2022.03.04
[백준 2470번] 두 용액  (0) 2022.03.02

댓글