[프로그래머스] 카펫

chanyeong kim·2021년 12월 19일
0

프로그래머스

목록 보기
35/51

📩 -->문제설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.


Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예

brownyellowreturn
102[4, 3]
81[3, 3]
2424[8, 6]

💡 solution(사용언어: python)

def solution(brown, yellow):
    tmp=[]
    # 곱해서 yellow를 만족하는 약수를 짝지어 tmp 에 넣어준다.
    for i in range(1,yellow+1):
        if yellow%i==0:
            divisor=sorted([yellow//i,i])
            if divisor in tmp:
                break
            tmp.append(divisor)
    # 약수의 합이 brown을 만족하는 애를 answer에 넣어준다.
    answer=[]
    for i in tmp:
        if sum(i)==(brown-4)//2:
            answer.extend(i)
   
    # 규칙을 기반해서 가로, 세로를 넣어준다.
    result=[]
    result.append(answer[1]+2)
    result.append((brown+yellow)//result[0])
    return result

👉 설명

  • yellow 의 약수들을 tmp에 담는다. 이 과정에서 yellow의 제곱근+1 까지 range를 잡아줄 수도 있다.
  • tmp=[[1,24][2,12][3,8][4,6]]
  • 여기서 원소들의 합이 brown에서 겹치는 부분을 제외하고 가로 + 세로가 같은 것을 찾는다.
    • for i in tmp:
            if sum(i)==(brown-4)//2:
                answer.extend(i)
  • answer[1]에서 겹쳤던 부분 2를 더해준 값이 전체 테두리의 가로, 전체 넓이를 테두리의 가로로 나누어 준 값이 세로를 담는 result를 리턴해준다.
  • 머릿속에 있는 거라 설명이 개떡같지만(다음부터는 설명 잘 해봐야지..) 기본적으로 약수를 이용해서 문제를 풀었다.

다른 풀이

def solution(brown, red):
    for i in range(1, int(red**(1/2))+1):
        if red % i == 0:
            if 2*(i + red//i) == brown-4:
                return [red//i+2, i+2]
  • 이건 둘레를 이용해서 구현을 했다.
  • 둘레의 합 = 2가로 + 2세로 - 겹치는 부분(4)

🌈 느낀 점

주일에 예배드리고 카페에서 후딱 풀었다!

출처: 프로그래머스

오류가 있으면 댓글 달아주세요🙂

0개의 댓글