프로그래머스[카펫]

oswaldeff·2021년 2월 2일
0
post-thumbnail

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

📝 문제 설명

Leo는 가게에서 본 전체 카펫의 크기(가로, 세로)를 기억해내려고 한다.

Leo가 카펫의 갈색 격자의 수인 brown과 노란 격자의 수인 yellow만 기억할때,
카펫의 가로, 세로 길이를 구하여 순서대로 배열에 담아 return한다.

📝 제한 조건

갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수이다.

노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수이다.

카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 길다.

💻 코드

import math
def solution(brown, yellow):
    # divisor
    y_divisor = int(math.sqrt(yellow))
    
    # discrimination
    while True:
        if yellow%y_divisor == 0:
            x_grid = int(yellow/y_divisor) + 2
            y_grid = y_divisor + 2
            if (x_grid >= y_grid) and (x_grid*y_grid - yellow == brown):
                break
        y_divisor -= 1
    
    # answer
    answer = [x_grid, y_grid]
    
    return answer

📌 divisor

주어진 yellow개수로 만들 수 있는 격자의 경우의 수를 알기 위하여,
yellow의 약수를 파악하고자 했다.

1부터 중간에 위치한 약수까지만 알아도 나머지 약수는 알 수 있기 때문에
중간에 위치한 약수를 구하기 위하여 제곱근을 이용하였다.

📌 discrimination

격자의 각 경우의 수에 대해, 주어진 제한 조건에 맞는지 판별하고자 하였다.

검증1: divisor가 yellow의 약수값인지 검증하였다.

검증1을 통과하면 전체 카펫의 가로길이를 divisor의 페어값 더하기2,
세로길이는 divisor 더하기2로 할당하였다.

이는 yellow를 기준으로 테두리를 채우고 있는 brown을 포함한 전체 격자 크기를 구하는 논리이다.

검증2: 전체 카펫 크기에 대해 가로길이가 세로길이 이상인지, 전체 격자 개수에서 yellow격자를 뺀 값이 brown값이 맞는지 검증하였다.

검증2까지 통과한다면 break로 while반복문을 빠져나오고,
통과하지 못한다면 y_divisor값이 1씩 감소하여 다시 검증1과 검증2를 받게된다.

📌 answer

전체 카펫의 가로길이값인 x_grid, 세로길이값인 y_grid를 answer배열에 할당해주었다.

💡 error

처음에는 일부 정확성 테스트를 통과하지 못하였는데,
해당 경우는 brown값이 14, yellow값이 4, return값이 [6, 3]인 테스트 케이스를 통과하면 해결이 가능하였다.

0개의 댓글