프로그래머스 : 완전탐색 - 카펫

n0wkim·2022년 5월 4일
0

코딩테스트

목록 보기
7/7
post-thumbnail

풀이

문제 이해하는데 15분 걸렸다. 직접 몇 개 그려보고 이해했다.
왜이렇게 지문이 길어...

일단 가로 * 세로가 총 블럭 개수랑 동일해야 하기 때문에 나누어 떨어지는 것들만 체크해서 가능성이 있는 크기의 카펫을 먼저 구한 뒤,

테두리를 채워 나가면서 남은 내부의 노란 타일이 일치할 경우 내가 찾는 조건이겠구나~ 했다.

검색한 것

  • 변수명 네이밍할 때 가로, 세로가 생각이 안나서 검색했다.
    horizontal, vertical 이랍니다~
  • 정수끼리 나누는데 소수점이 나오네? 그래서 정수형으로 형변환을 해야 했기 때문에 검색했다.
    int(변수) 로 하면 된다고 합니다~ (c랑 동일)

코드

def calculate(n,m):
    return (n + m) * 2 - 4

def check(horizontal, vertical, brown, yellow):
    cnt = 0
    total_brown = 0
    
    while total_brown < brown :
        total_brown = calculate(horizontal, vertical)
        cnt += 1
        horizontal -= 2
        vertical -= 2
    
    if total_brown == brown:
        return True
        
def solution(brown, yellow):
    answer = []
    block_size = brown + yellow
    
    # i 는 세로길이
    for i in range(3,block_size):
        if block_size % i == 0 :
            if check(int(block_size/i), i, brown, yellow):
                answer = [int(block_size/i),i]
                return answer

뭐 나름 깔끔하게 짠 것 같다.

  1. 나누어 떨어지는 것을 이용해서 가로, 세로 길이 구한다.
  2. check() 함수에서 조건에 만족하는지 체크해서 맞으면 답을 리턴한다.

check() 함수 설명

테두리를 채운다. 테두리는 n*m size일 때 2n + 2m - 4 인 것을 이용했다.
while loop을 돌다가 테두리를 너무 많이 채우거나, 조건에 맞으면 나가게 되며, 마지막 리턴할 때 조건에 맞는지만 체크한다.

한줄평

뭐... 사실 별 거 없지만 이 글을 쓴 이유는 다른 사람의 코드를 보고 발상의 전환을 맛보았기 때문이다. 함 보자.

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) = 갈색 둘레

물론 나도 이걸 쓰긴 했는데, 그냥 for 문 안에서 처리해버렸다.
return할 때도 참 짧게 작성했다.

뭐... 근데 처음 보고 이해하기는 어렵다.
아직 파이썬 실력이 살짝 낮은 것 같기도 하다.

profile
끙끙대며 배우는 중

0개의 댓글