Algorithm/코딩테스트 (Python)

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

싱브이 2023. 12. 6. 22:18
728x90
반응형

문제

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

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

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

 

 

내 생각

악 완전탐색 쉬운듯 넘 어렵다 이건 수학적 센스도 필요하고 규칙도 잘 찾아야 하고 구냥 뭐 아무튼 해낼거라는 얘기

이 문제도 문제를 이해하고 엥? 했다. 그래서 조금의 검색도 함 ㅎㅎ ㅠ

아무튼 내가 해결한 방법은

1. 전체 크기를 구한다.

2. 모든 가로 세로가 될 수 있는 경우의 수를 구한다. : 제곱근을 구하는 int(total**0.5) 를 잊지마,,

3. 노란색 부분을 구한다

4. 노란색 부분이 일치해? 그게 답이다

그러니까 가장 중요했던건 약수 구할 줄 알아? 인 것같다 !

(다른 사람의 풀이보니까 수학적 공식을 도입한 사람도 있었고, 구냥 대박이었다,,)

 

 

 

 

내 코드

def solution(brown, yellow):
    size = brown + yellow
    # 약수의 쌍을 찾아가며 가로, 세로 길이 검증
    # total의 제곱근까지만 반복 
    for i in range(1, int(size**0.5)+1):
        #n을 i로 나누었을 때 나누어 떨어지면 그게 일부의 약수들 
        if size % i == 0:
            # i가 가로 길이, total//i가 세로 길이
            #(i-2)는 갈색 테두리의 가로 길이를 제외한 한 행의 노란색 수
            #(size//i-2)는 갈색 테두리의 세로 길이를 제외한 한 열의 노란색 수
            y = (i-2) * (size//i-2)
            # 노란색수가 일치하는지 확인
            if y == yellow:
                return [size//i, i]

 

 

다른 사람의 코드

def solution(brown, yellow):
	w = (brown / 2) + 1
    h = 1
    while w >= h:
    	if (w-2) * (h-2) == yellow:
        	return [w, h]
        w -= 1
        h += 1

 

728x90
반응형