코딩테스트

[Python] 프로그래머스 - 카펫

2023. 8. 31. 17:57

문제: https://school.programmers.co.kr/learn/courses/30/lessons/42842

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제를 보고 yellow의 약수를 나열해 문제를 풀면 되겠다고 생각했다.

곱해서 yellow 값이 나오는 약수 쌍을 구한 후, 각 쌍의 테두리 값을 구했을 때 brown과 값이 일치하는 쌍을 구하면 된다.

 

이때 약수 쌍을 (x, y)라고 하면, 테두리 값은 (x+1)*2 + (y+1)*2로 구할 수 있다.

return값은 카페트의 총 가로, 세로 길이를 돌려주므로 (x+2, y+2)를 반환하면 된다.

 

위 로직을 토대로 처음 짠 코드는 다음과 같다.

def solution(brown, yellow):
    answer = []

    nums = [(1, yellow)]
    for i in range(2, ((yellow)//2)+1):
        if yellow % i == 0:
            print(yellow//i, i)
            if i < yellow // i:
                nums.append((i, yellow // i))
          
    for x, y in nums:
        if (x+1)*2 + (y+1)*2 == brown and y >= x:
            answer = [y+2, x+2]

    return answer

예제 3개는 다 맞는데, 코드를 제출하면 히든케이스 1, 2, 3번에 대해 오답이 뜬다 ㅜㅜ

엣지 케이스를 고민하다가 코드 자체에 예외사항을 최대한 주지 않고 일반화 해야겠다고 생각했다.

(현재 코드는 [(1, yellow)]값을 먼저 가지고 시작하고, yellow//2 까지만 약수 쌍을 구하고 있기 때문이다)

 

일반화한 코드는 다음과 같다.

def solution(brown, yellow):
    answer = []
    
    nums = []
    for i in range(1, (yellow+1)):
        if yellow % i == 0:
            if i <= yellow // i:
                nums.append((i, yellow//i))
            else:
                break

	for x, y in nums:
        if (x+1)*2 + (y+1)*2 == brown and y >= x:
            answer = [y+2, x+2]

    return answer

예외사항을 없애는 대신 약수 쌍의 값이 뒤집어지는 순간 (중복 값이므로) for문을 break하는 조건을 추가해주었다.