본문 바로가기

알고리즘 문제

프로그래머스 카펫

일단 red, brown으로 만들어지는 모양은 십자가같은 건 아니고 직사각형이다.

가로, 세로 길이가 다양하게 나올 수 있는데 주어진 red, brown의 타일 수로 red 직사각형을 만들고 brown으로 그 테두리를 감쌀 수 있으면 되는 것이다.

 

red의 개수로 직사각형을 그리다보면 red를 만들 수 있는 공약수로 짝을 지어서 그릴 수 밖에 없다.

red가 9면 1 x 9, 3 x 3

27이면 1 x 27, 3 x 9

24면 1 x 24, 2 x 12, 3 x 8, 4 x 6

이런 식이다.

가로의 길이는 세로보다 같거나 크다.

 

red로 만들 수 있는 다양한 직사각형의 테두리에 brown의 개수를 다 써서 채우는 걸 찾으면 된다.

red의 공약수 짝으로부터 테두리에 쓰인 타일 수를 구하는 식은

red의 가로 x 2 + (red의 세로 + 2) x 2이다.

red로 만들어진 짝을 가지고 테두리 수를 하나하나 구해서 주어진 brown과 일치하는 지 판단하면 된다.

일치한다면 [red의 가로 + 2, red의 세로 + 2]를 반환하면 된다.

def get_cd(red):
    cds = []
    cd_dict = {}
    for i in range(1, red+1):
        if red % i == 0:
            cds.append(i)
    cds_len = len(cds)
    for j in range(cds_len//2):
        cd_dict[cds[cds_len - j - 1]] = cds[j]
    if cds_len % 2 == 1:
        cd_dict[cds[cds_len//2]] = cds[cds_len//2]
    return cd_dict


def solution(brown, red):
    cd_dict = get_cd(red)
    for x, y in cd_dict.items():
        if brown == x * 2 + (y + 2) * 2:
            return [x + 2, y + 2]

테스트 케이스

print(solution(10, 2))
print(solution(8, 1))
print(solution(54, 24))
print(solution(24, 24))
print(solution(16, 9))

 

출처 https://programmers.co.kr/learn/courses/30/lessons/42842?language=python3

 

코딩테스트 연습 - 카펫 | 프로그래머스

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 빨간색으로 칠해져 있고 모서리는 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 빨간색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. Leo가 본 카펫에서 갈색 격자의 수 brown, 빨간색 격자의 수 red가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수

programmers.co.kr

 

'알고리즘 문제' 카테고리의 다른 글

프로그래머스 입국심사  (0) 2019.09.01
프로그래머스 예산  (0) 2019.08.31
프로그래머스 숫자 야구  (0) 2019.08.30
프로그래머스 소수 찾기  (0) 2019.08.29
프로그래머스 모의고사  (0) 2019.08.29