참고: https://school.programmers.co.kr/learn/courses/30/lessons/42842
✔️ 문제
문제는 다음과 같다.
✔️ 풀이
예제에 나와있는 것 같이 10개의 갈색과 2개의 노란색이 주어졌을 때,
맨윗줄과 아랫줄 4개 및 왼쪽 오른쪽 1개씩 해서 10개이고
가운데에 노란색 2개가 들어가는데 이는 가로가 4, 세로가 3으로 이루어진 직사각형과 같다.
def solution(brown, yellow):
result = brown + yellow
n = result // 2
data = []
for i in range(1, n+1):
if result % i == 0:
data.append(i)
data.append(result//i)
data = sorted(list(set(data)))
l = len(data)
if l%2 == 0: answer = [data[l//2], data[l//2-1]]
else: answer = [data[l//2], data[l//2]]
return answer
처음에는 다음과 같이 갈색과 노란색을 더한수에서 나올 수 있는
조합의 수 중 절반에 해당하는 인덱스 두 개의 값이 return 값이라 생각했다.
하지만, 테스트 케이스 4,6,7에서 실패하였는데 이에 대한 반례로
18개와 6개의 갈색, 노란색이 주어지면 [8, 3]이 아닌 [6, 4]를 반환하기 때문이였다.
위아래 16개 + 양옆 2개로 가로 8개와 세로 3개의 답을 잘못 출력했기 때문이다.
(8-2를 하면 총 6개의 노란색이 들어갈 수 있다)
그래서 모서리를 뺀 세로와 가로를 곱한 수가 노란색과 일치하면
해당하는 가로와 세로를 answer에 추가하는 식으로 참고할 수 있었다.
def solution(brown, yellow):
answer = []
n = brown + yellow
for i in range(3, int(n/2)+1):
j = n / i
if (j*10) % 10 != 0 : continue
if (i-2) * (j-2) == yellow:
answer.append(i)
answer.append(int(j))
break
if answer[0] < answer[1]:
answer.sort(reverse=True)
return answer
첫번째 코드에서도 생각한 것이지만 홀수인 경우에
n을 2로 나눈 값이 float형이 나올 수 있기 때문에 int형으로 반환해야 한다.
또한, j도 홀수로 나누면 float형이 나올 수 있기 때문에 int형으로 반환해야한다.
[8, 6]과 [6, 8]이 있을 때 인덱스 1번이 더크면 [8, 6]으로 정렬해준다.
화이팅 💪
'알고리즘(algo) > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 해시 - 전화번호 목록 (0) | 2023.03.03 |
---|---|
[프로그래머스] 탐욕법(Greedy) - 체육 (0) | 2023.03.02 |
[프로그래머스] 완전탐색 - 소수 찾기 (0) | 2023.02.16 |
[프로그래머스] 정렬 - K번째수 (0) | 2023.02.07 |
[프로그래머스] 완전탐색 - 모의고사 (0) | 2023.02.07 |