코딩테스트
[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하는 조건을 추가해주었다.