본문 바로가기
Study/Algorithm & Data structure

[프로그래머스] [완전탐색] 카펫 (201105)

by 후이 (hui) 2020. 11. 5.
728x90
반응형

 

 

programmers.co.kr/learn/courses/30/lessons/42842

 

코딩테스트 연습 - 카펫

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

programmers.co.kr

 

 

1. 문제 설명

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]

 

 

2. 풀이 

 

핵심 제약 조건 :

1) brown 은 무조건 테두리 1줄 

이는 즉 brown 의 가로는 yellow 가로 +2

            brown 의 세로는 yellow 세로 +2

 

2) 카펫은 반드시 가세로 길이가 같거나 가로가 더 커야함 

따라서 yellow 배수를 순차적으로 살펴볼 때 

배수 중 더 큰 값이 가로가 되게끔 만들었음 

가령 yellow 가 15면 가로 5, 세로 3 으로 되도록 ** 

 ==> 코드에서는 절반만 탐색을 하게 했고, 더 큰 값이 튜플의 앞에 들어가도록 했음 

 

def solution(brown, yellow):

    pair = []
    if yellow == 1:
        return [3,3]
    else:
        for div in range(1, (yellow//2)+1):
            if yellow % div == 0:
                if (div, int(yellow /div)) in pair :
                    return 0
                    
                # 검사
                y_rownum, y_colnum = int(yellow /div), div
                t_row, t_col = y_rownum + 2,  y_colnum + 2

                if t_row * t_col == brown + yellow:
                    return [t_row, t_col]
                else:
                    pair.append((int(yellow /div), div))

 

728x90
반응형

댓글