[프로그래머스] 카펫 (파이썬)
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42842
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
갈색과 노란색의 격자의 개수가 주어졌을때 전체 카펫의 크기를 구하는 문제이다. 언뜻 보면 쉬울수 있지만 함정이 존재한다.
이 문제는 손으로 그려가다 보면 풀이 방식이 금방 이해가 갈것이다.
1. 갈색과 노란색의 격자 수를 더한 값을 구한다
2. 노란색이 중앙에 위치하려면, 즉 노란색 격자들을 전부 갈색으로 감싸는 방식으로 카펫을 구성하려면 카펫의 세로 길이는 최소 3부터 시작한다.
3. 전체 격자의 크기에서 세로의 길이를 나누고 만약 나머지가 존재하지 않는다면 해당 몫은 가로 길이가 된다.
4. (가로-2) * (세로-2) == yellow를 검증한다
여기까지는 금방 쉽게 떠오를수 있지만 특정 조건을 추가해서 확인해야한다.
예를 들면 다음과 같은 경우가 있다.
입력값 : (18, 6)
비정상 출력값 : (6, 4)
정상 출력값 : (8, 3)
4번 조건없이 할경우 (6, 4)반환되고 이 모양의 카펫에서는 노란색이 8개가 된다.
하지만 이렇게 할 경우 인자로 주어진 노란색 격자의 갯수와 출력하는 값이 다르게 되어 잘못 푼게 된다.
그러므로 카펫 가장자리를 제외한 부분의 크기와 노란색 격자의 갯수와 동일한지 검증하는 로직을 추가해야 한다.
나는 처음에 ==가 아닌 >=연산자를 사용했는데 생각이 짧았는듯 하다
코드
def solution(brown, yellow):
st = []
total = brown + yellow
y = 3
while True:
if (total%y == 0) :
if (total//y-2) * (y-2) == yellow:
st.append([total//y, y])
y = y + 1
if (total/y) < y:
break
return st[-1]