개발자 블로그

프로그래머스 - 카펫(완전탐색) 본문

알고리즘/프로그래머스

프로그래머스 - 카펫(완전탐색)

hayongwoon 2022. 5. 13. 23:14

문제 설명

더보기

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

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

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

제한사항
  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
입출력 예brownyellowreturn
10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

출처

※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.
※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.

 

나의 풀이

# 브라운과 옐로우 갯수의 합을 구하고 합의 약수를 구한다.
# 제곱근이 정수라면 제곱근이 가로 세로
# 인트가 아니라면 그 양쪽에 있는 약수가 가로 세로의 길이

def solution(brown, yellow):
    s = brown + yellow
    if s**0.5 == int(s**0.5):
        answer = [s**0.5, s**0.5]
    else:
        for i in range(int(s**0.5)+1, s):
            if not s % i and (i-2)*(s//i-2) == yellow: # i가 s의 약수이면서 두 수에서 -2를 한 값의 곱이 yellow가 나와야한다.
                answer = [i, s//i]
                break
            
    return answer

나의 알고리즘

1) 두 수의 합의 약수 중 가장 안쪽에 있는 값 예를 들어 두 수의 합이 12이면 3과 4가 답이라고 생각

 

2) 하지만 (가로길이 -2)*(세로길이-2) = 옐로우 블럭의 갯수 조건도 만족해야한다.

 

 

*문제를 보면 두가지 조건을 찾아야한다. 

1) 두 블럭의 갯수의 합 = 넓이(가로 * 세로)

2) (가로길이 -2)*(세로길이-2) = 옐로우 블럭의 갯수

 

이 두조건을 파악하면 문제를 접근하기 쉽다. 이차방정식으로 접근할 수도 있고...나는 2번째 조건을 늦게 찾게 되어서 위와같이 접근을 하게되었다. for문 안 if 문에 and로 2번째 조건 추가!