[문제]
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/42842
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🎨 풀이
💡 전체 코드
def solution(brown, yellow):
answer = []
total = brown + yellow
for num in range(3,total//2):
if total % num == 0:
a = total // num
b = num
if (a-2) * (b-2) == yellow :
answer.append(a)
answer.append(b)
break
answer.sort(reverse=True)
return answer
> 핵심 : yellow = (x-2) * (y-2)
🍦 코드 설명 (실행 순서대로 나열)
#solution
answer = []
total = brown + yellow
1. 변수와 리스트를 초기화한다.
- answer : 정답 (리스트)
- total : 총 칸 수 (brown + yellow)
#solution - 가로, 세로 구하기
for num in range(3,total//2):
if total % num == 0:
a = total // num
b = num
if (a-2) * (b-2) == yellow :
answer.append(a)
answer.append(b)
break
2. 3부터 total//2 까지 for문을 실행한다.
- 1, 2를 패스한 이유는 가로 세로 중 하나가 그 숫자라면 yellow가 들어갈 자리가 없기 때문이다.
( 문제에서 yellow는 1 이상이라고 함)
- [3, 12] / [12, 3] 를 같은 경우라고 보기 때문에 절반만 실행해도 된다.
# total이 num으로 나누어떨어지는 경우
3. a에 total // num, b에 num을 넣는다.
- (ex) total = 12 , num = 3 => a = 4, b = 3
4. 만약 (a-2) * (b-2) 가 yellow와 같다면 answer에 a와 b를 넣은 후 for문을 종료한다.
answer.sort(reverse=True)
return answer
5. answer을 역순으로 정렬한다.
- 가로길이가 더 길다고 나와있고, 정답은 [가로,세로] 순서라고 문제에 적혀있기 때문이다.
6. answer을 return한다.

끝~
⭐ 느낀점
> 그림 그려서 풀다보니까 저 yellow 구하는 공식을 깨달았다. 나중에는 완전탐색으로도 한 번 풀어봐야겠다. 아직 감은 안잡히지만 나중에 성장하면 할 수 있을듯. ㅎ_ㅎ 파이팅!
'🎲 알고리즘 공부 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / Level 2] 프린터 (파이썬) (0) | 2022.09.26 |
---|---|
[프로그래머스 / Level 2] 영어 끝말잇기 (파이썬) (0) | 2022.09.24 |
[프로그래머스 / Level 2] 기능개발 (파이썬) (0) | 2022.09.22 |
[프로그래머스 / Level 2] JadenCase 문자열 만들기 (파이썬) (0) | 2022.09.22 |
[프로그래머스 / Level 2] 피보나치 수 (파이썬) (0) | 2022.09.20 |