250x250
vg-rlo
vg-rlo
vg-rlo
전체 방문자
오늘
어제
  • CATEGORY (114)
    • 일상과 기록 (12)
    • REVIEW (11)
    • DATA (20)
      • ML and DL (6)
      • NLP (2)
      • Growth hacking (2)
      • Note (10)
    • CODE (46)
      • Algorithm and Data Structur.. (2)
      • Coding Test (34)
      • DB (2)
      • Python (6)
      • Linux (2)
      • Github (0)
    • Portfolio (6)
      • Pratice and Tutorials (2)
      • Toy Projects (2)
      • Competitions (2)
      • Data Analysis (0)
    • ISSUE (17)
    • 🛠... (0)

블로그 메뉴

  • Github

인기 글

티스토리

hELLO · Designed By 정상우.
vg-rlo

vg-rlo

[Programmers] 완전 탐색 - 카펫
CODE/Coding Test

[Programmers] 완전 탐색 - 카펫

2021. 7. 6. 10:39
프로그래머스 카펫: https://programmers.co.kr/learn/courses/30/lessons/42842
 

코딩테스트 연습 - 카펫

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

programmers.co.kr

문제 설명

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

문제내 참고 이미지

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

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

입출력 예

brown yellow return
10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

 

알고리즘 - 소수 찾기

  • 프로그래머스 완전탐색에서 소수 찾기 문제를 풀 때, 사용했던 알고리즘을 활용합니다. 
    해당 글: https://vg-rlo.tistory.com/127

 

제출 코드

  • 먼저, brown과 yellow 블럭간의 관계를 살펴봐야합니다. brown은 yellow를 둘러싸는 블럭이므로 모서리에 해당하는 블럭 4개와 가로, 세로 양변에 두번씩 들어간다는 점에서 yellow의 가로 블럭 개수*2, yellow의 세로 블럭 개수*2 해준 값의 합으로 개수를 구할 수 있습니다. 
  • yellow 같은 경우 같은 개수의 블럭이라도 가로/세로 블럭의 개수에 따라 brown 블럭의 개수가 달라집니다. 예를 들어 10개의 블럭이 사용됐다 하더라도, 1x10 또는 2x5로 배치될 수 있습니다. 따라서 주어진 yellow의 수를 어떤 수로 나눔으로써 나올 수 있는 곱의 조합을 구해야합니다. 소수 찾기때와 비슷하게 주어진 수의 제곱근까지 1부터 주어진 수를 나눠줍니다. (다만, 소수 찾기는 2부터 살펴보는 반면, 카펫 문제는 곱의 조합을 보기 때문에 1부터 살펴봅니다.)
  • if 조건문을 통해 여러 개의 곱의 조합들 중에 brown과 개수가 같은 조합을 선택합니다. 
  • yellow 가로/세로 배치 개수에서 각각 brown은 1만큼 padding(1칸씩 모든 면에서 확장)된 것이기 때문에 가로+2, 세로+2를 해줌으로써 최종적인 카펫의 크기를 구합니다. 
def solution(brown, yellow):
    answer = []

    for y in range(1, int(yellow**(1/2))+1):
        if yellow % y == 0:
            quot = yellow // y 
            b = quot*2 + y*2 + 4 
            if b == brown:
                pattern = [quot, y]
                answer = [quot+2, y+2]
    # print(brown, '-', yellow,':',pattern)

    return answer

if __name__ == '__main__':
    browns = [10, 8, 24]
    yellows = [2, 1, 24]
    # answer = [4,3], [3,3], [8,6]

    for inp in zip(browns, yellows):
        print(solution(inp[0], inp[1]))

 

실행 결과

테스트 1 〉 통과 (0.01ms, 10.2MB)
테스트 2 〉 통과 (0.02ms, 10.3MB)
테스트 3 〉 통과 (0.10ms, 10.3MB)
테스트 4 〉 통과 (0.02ms, 10.3MB)
테스트 5 〉 통과 (0.02ms, 10.2MB)
테스트 6 〉 통과 (1.33ms, 10.3MB)
테스트 7 〉 통과 (0.12ms, 10.3MB)
테스트 8 〉 통과 (0.10ms, 10.2MB)
테스트 9 〉 통과 (0.11ms, 10.2MB)
테스트 10 〉 통과 (0.08ms, 10.2MB)
테스트 11 〉 통과 (0.01ms, 10.2MB)
테스트 12 〉 통과 (0.01ms, 10.3MB)
테스트 13 〉 통과 (0.02ms, 10.2MB)

 

저작자표시 비영리 변경금지 (새창열림)
    'CODE/Coding Test' 카테고리의 다른 글
    • [Programmers] 해시 - 전화번호 목록
    • [Programmers] 해시 - 완주하지 못한 선수
    • [Programmers] 완전 탐색 - 소수 찾기
    • [Programmers] DFS/BFS - 타겟넘버
    vg-rlo
    vg-rlo
    🛠블로그 공사중.. Keep going! 🤔 (Profile - Dinotaeng®)

    티스토리툴바