문제: https://school.programmers.co.kr/learn/courses/30/lessons/42842
문제를 보고 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하는 조건을 추가해주었다.
'코딩테스트' 카테고리의 다른 글
[Python] 프로그래머스 - 입국심사 (0) | 2023.10.18 |
---|---|
[Python] 프로그래머스 - 섬 연결하기 (0) | 2023.09.02 |
[Python] 프로그래머스 - 전화번호 목록 (0) | 2023.08.25 |
[Python] 백준 20055번 - 컨베이어 벨트 위의 로봇 (0) | 2023.08.23 |
[Python] 백준 15684번 - 사다리 조작 (0) | 2023.08.23 |