Notice
Recent Posts
Recent Comments
Link
«   2025/12   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

그냥하는코딩

프로그래머스 2단계 - 멀쩡한 사각형 본문

카테고리 없음

프로그래머스 2단계 - 멀쩡한 사각형

UKkim 2021. 5. 21. 00:40

https://programmers.co.kr/learn/courses/30/lessons/62048

 

코딩테스트 연습 - 멀쩡한 사각형

가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을

programmers.co.kr

1. 문제이해

 - 최대공약수를 활용하여 축소된 영역을 구하고 전체영역에 대해 계산

 - 수학공식보다 컴퓨터를 활용한 방식으로 계산해보기 (소수점에 대한 계산 등의 이유)

 

2. 코드작성

def solution(w,h):
    answer = w * h

    # 세로로 더 긴 모양의 격자를 만들기위함
    minW = min(w,h)
    maxH = max(w,h)
    
    gcd = 0
    
    # 최대공약수 
    for i in range(minW, 0, -1):
        if w % i == 0 and h % i == 0:
            gcd = i
            break

    minW = minW / gcd # 축소된 격자
    maxH = maxH / gcd # 축소된 격자
    delCnt = 0
    temp = 0
    
    while True:
        temp = temp + minW
        if temp < maxH:
            delCnt = delCnt + 1
        elif temp == maxH:
            delCnt = delCnt +1
            break
        else:
            delCnt = delCnt + 2
            temp = temp - maxH
    
    answer = answer - (delCnt * gcd)
    return answer

아래 while 문에 대해 설명하자면 temp값이 1을 넘어 다음 블록까지 가면 2개를 1을 넘지않으면 1개를 차지한다고 계산하였다. 이런 식이 가능한 이유는 세로로 더 긴 형태의 모양으로 만들어주었기 때문이다.

예시 : (1, 2) : +1 -> (2, 4(1)) +2 -> (3, 3) +1

※ 시간복잡도

O(minW + maxH) => O(n)

 

3. 풀이간 체크사항

 1) 최대공약수 재귀로 구하는 코드

def gcd(a, b): return b if (a == 0) else gcd(b % a, a)   
Comments