티스토리 뷰

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

 

코딩테스트 연습 - 카펫

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

programmers.co.kr

<풀이>

  • 노란색 사각형의 경우의 수를 모두 고려하고
  • 그 노란 사각형을 갈색 격자로 한 층씩 덮어가는 식으로 구현하였다.
  • 남은 갈색 격자의 수가 정확히 0이라면 answer로 반영한다.

 

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
32
33
34
35
def solution(brown, yellow):
    answer = []
    
    for y_y in range(1, yellow + 1):
        # 주어진 격자가 사각형이 되어야하기 때문에 세로 길이로 나눠서 나머지가 0이어야 한다
        if not yellow % y_y:
            # 가로 길이를 구하고
            y_x = yellow // y_y
            # 세로가 더 길면 무시
            if y_y > y_x:
                continue
            # 현재 카펫 격자의 수
            num_carpet = yellow
            # 남은 갈색 격자의 수
            remain_brown = brown
            # 현재 카펫의 가로 길이
            cur_x = y_x
            # 현재 카펫의 세로 길이
            cur_y = y_y
            # 갈색 격자를 다 소진할 때 까지
            while remain_brown > 0:
                # 갈색으로 덮을 때마다 가로, 세로 길이가 2씩 늘어난다.
                cur_x += 2
                cur_y += 2
                # 직사각형을 키울 때마다 필요한 갈색 격자의 수
                added_brown = (cur_x) * (cur_y) - num_carpet
                remain_brown -= added_brown
                num_carpet += added_brown
            
            # 남은 갈색 격자의 수가 정확히 0이라면 answer에 반영하고 break한다.
            if remain_brown == 0:
                answer.append(cur_x)
                answer.append(cur_y)
                break
    return answer
cs

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함