티스토리 뷰

문제출처 - https://programmers.co.kr/learn/courses/30/lessons/42842

 

코딩테스트 연습 - 카펫 | 프로그래머스

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 빨간색으로 칠해져 있고 모서리는 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 빨간색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. Leo가 본 카펫에서 갈색 격자의 수 brown, 빨간색 격자의 수 red가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수

programmers.co.kr

정답1

def divisor(num):
    li = []
    for i in range(1, num + 1):
        if num % i == 0:
            li.append(i)
    return li

def solution(brown, red):
    
    div = divisor(red)
    
    if len(div) % 2 == 1:
        div.insert(len(div) // 2, div[len(div) // 2])
    
    for i in range(len(div) // 2):
        a = div[i]
        b = div[len(div) - i - 1]
        if (a + b + 2) * 2 == brown:
            return [b + 2, a + 2]
    

설명

  • div에 red의 약수 저장
  • 만약 red가 홀수라면(red == n^2) n을 한개 더 끼워줬음 [1, 3, 9] -> [1, 3, 3, 9]
  • div의 양끝부터 가운데로 오면서 완전탐색
  • 가로가 더 크다고 해서 b가 앞으로 오도록 리턴

 

정답2

import math

def divisor(num):
    arr = []
    for i in range(1, int(math.sqrt(num)) + 1):
        if num % i == 0:
            arr.append([i, num // i])
    return arr

def solution(brown, red):
    divide = divisor(red)

    for idx, (a, b) in enumerate(divide):
        if (a + b + 2) * 2 == brown:
            return [b+2, a+2]

divide배열에 red를 소인수분해하고 그 값들을 쌍으로 넣어줌

 

예를 들어, red가 24면

 

divide = [[1, 24], [2, 12], [3, 8], [4, 6]] 가 저장됨

 

2번 풀이가 효율성이 더 좋게 나옴

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함