카펫 (Programmers 42842)

문파이더맨·2021년 5월 7일
0

Algorithm

목록 보기
16/58
post-thumbnail

🧑‍💻 문제

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]

🧑‍💻 해결방법

  • 약수로 풀어야하는 문제이다.
  • 무턱대고 dictionary를 만드려했으나 이는 잘못된 방법. 굳이 그럴 필요가 없었다.
  • permutation을 사용하려했으나 이 또한 문제를 크게 만들뿐!
  • 약수로써 yellow에 대한 리스트를 만드는 함수를 따로 만들어서 빼줬다.
  • 복잡하지만 알고보면 간단한 방법.

🧑‍💻 코드

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

def solution(brown, yellow):
    answer = []
    y_chk = []

    for i in range(1, yellow + 1):
        if yellow % i == 0:
            y_chk.append(i)

    y_list = divisor(yellow)
    b_list = [[i[0] + 2, i[1] + 2] for i in y_list]

    if len(y_chk) % 2 == 1:
        for i in b_list:
            if i[0] == i[1]:
                answer.append(i[0])
                answer.append(i[1])
    elif len(y_chk) % 2 == 0:
        for i in b_list:
            if i[0] > i[1]:
                if (i[0] * i[1]) == (brown + yellow):
                    answer.append(i[0])
                    answer.append(i[1])
    return answer

🧑‍💻 코드해석

  • y_chk 부분을 빼준 이유는 약수의 갯수가 홀수인 경우에는 가운데에 있는 숫자가 해답이 되기 때문이었다.
  • b_list를 보면 리스트 안에 y_list를 활용해서 2차원 리스트를 만들었다.

🧑‍💻 총평

  • 로직은 간단했으나 구현에 문제가 있었다.
  • 그만큼 아직 경험과 생각하는 방법엔 초기단계라는 것을 뜻하는 듯하다.
  • 오랜만에 '뒤쳐지는 것이 아닌가' 하는 생각이 들었지만 이내 다시 마음을 다잡았다. 조금 늦어지면 어떠하리 묵묵히 내 방식을 믿고 증진!
  • 남규의 코드가 확실히 간결했다! 함수를 사용하는 방법에 대해서 많이 알고있었고 역시 배울점이 많았다.
  • 검색할 때 그냥 넘겼던 Counter, reduce를 활용하는 것을 보고 쉽게 지나치지 말아야겠다고 생각했다.
  • 아직 갈 길이 멀다! 먼 길을 가기위해서는 페이스 조절이 가장 중요하다!

🙋‍♂️ 남규 깃헙 : https://github.com/Noaarhk

profile
Sever 개발할래요.

0개의 댓글