본문 바로가기
알고리즘/CodeUp PS

[CodeUp][Python] 1297번 : 단면의 최대 넓이

by 빛밤하늘 2021. 9. 29.
반응형

밑의 링크는 CodeUp에서의 문제 링크입니다.

문제는 링크를 통해서 직접 봐주시길 바랍니다.

 

단면의 최대 넓이

그림과 같이 길이가 $n$인 철판을 구부려서 단면이 직사각형인 ㄷ자 모양을 만들려고 한다. 이 ㄷ자 모양을 수직으로 자른 단면의 넓이 $S$를 최대로 하려면 양 끝에서 얼마만큼 구부려야 하는지

codeup.kr

 

 

 

주의해야 할 점

1. readline과 int나 float를 사용하는 입력 방식

readline을 사용해서 입력할 때는 맨 끝에 \n이 붙어서 입력됩니다.

하지만, 입력한 값을 int나 float으로 처리해 정수, 실수형으로 만들어 줄 때는 

굳이 \n을 떼기 위해 rstrip을 사용할 필요가 없습니다.

숫자 형태를 만들어줄 때 자동으로 사라집니다.

num = int(sys.stdin.readline())

 

 

예제 설명

1. 첫 번째 예제

- 입력

16

 

- 출력

4

 

- 설명

입력한 철판의 길이 n은 16입니다.

구부린 철판의 길이를 1부터 절반 미만까지인 16 / 2 - 1 = 7까지 비교해봤을 때 단면의 넓이는 다음과 같습니다.

 

  • 구부린 길이 : 1일 때 단면의 넓이 S = 1(세로) X 14(가로) = 14
  • 구부린 길이 : 2일 때 단면의 넓이 S = 2(세로) X 12(가로) = 24
  • 구부린 길이 : 3일 때 단면의 넓이 S = 3(세로) X 10(가로) = 30
  • 구부린 길이 : 4일 때 단면의 넓이 S = 4(세로) X 8(가로) = 32
  • 구부린 길이 : 5일 때 단면의 넓이 S = 5(세로) X 6(가로) = 30
  • 구부린 길이 : 6일 때 단면의 넓이 S = 6(세로) X 4(가로) = 24
  • 구부린 길이 : 7일 때 단면의 넓이 S = 7(세로) X 2(가로) = 14

 

단면의 넓이가 최대인 경우는 구부린 길이가 4일 때이므로, 4를 출력합니다.

 

 

생각한 풀이 과정

구부리는 길이는 정수 범위에서 생각하므로 구부리는 길이를 1부터 n-1까지 반복하면서

단면의 넓이 S를 구해 단면의 넓이가 최댓값일 때 구부리는 길이를 구하면 됩니다.

 

철판의 길이 n을 입력하고, int형으로 변환합니다.

n = int(stdin.readline())

 

단면의 넓이 S의 최댓값을 저장할 변수와

단면의 넓이 S가 최댓값일 때 양 끝에서 구부린 길이를 저장할 변수를 선언합니다.

max_s = 0
max_s_bend_len = 1

 

- 반복문 시작

구부린 길이를 1부터 n // 2 - 1까지 반복해봅니다.

for bend_len in range(1, n // 2):

 

현재 구부린 길이에서 단면의 넓이를 계산해봅니다.

s = bend_len * (n - 2 * bend_len)

 

현재 구부린 길이에서 단면의 넓이가 이전까지의 단면의 최대 넓이보다 크다면

max_s에 현재 단면의 넓이를 저장합니다.

max_s_bend_len에 현재 구부린 길이를 저장합니다.

최대 넓이가 같은 경우 구부리는 길이가 최소인 것을 출력해야 하므로, 

조건문을 '>=' 말고 '>'으로 사용해야 합니다.

if s > max_s:
    max_s = s
    max_s_bend_len = bend_len

- 반복문 끝

 

단면의 넓이가 최대일 때 구부린 길이를 저장하고 있는 max_s_bend_len의 값을 출력합니다.

print(max_s_bend_len)

 

 

제출한 파이썬 코드

# readline을 사용하기 위해 import합니다.
from sys import stdin


# 길이 n을 입력합니다.
# int형으로 변환합니다.
n = int(stdin.readline())
# 단면의 넓이 S의 최댓값을 저장할 변수를 선언합니다.
# 0으로 초기화합니다.
max_s = 0
# 단면의 넓이 S가 최댓값일 때, 양 끝에서 구부린 길이를 저장할 변수를 선언합니다.
# 1로 초기화합니다.
max_s_bend_len = 1

# 구부린 길이를 1부터 n // 2 - 1까지 반복해봅니다.
for bend_len in range(1, n // 2):
    # 현재 구부린 길이에서 단면의 넓이 S를 계산해봅니다.
    s = bend_len * (n - 2 * bend_len)

    # 현재 구부린 길이에서 단면의 넓이 S가 이전까지의 단면의 최대 넓이보다 크다면
    if s > max_s:
        # max_s에 현재 단면의 넓이 S를 저장합니다.
        max_s = s
        # max_s_bend_len에 현재 구부린 길이를 저장합니다.
        max_s_bend_len = bend_len

# 단면의 넓이 S가 최대일 때 구부린 길이를 저장하고 있는 max_s_bend_len의 값을 출력합니다.
print(max_s_bend_len)

 

 

제출 결과

CodeUp 1297번 : 단면의 최대 넓이에서 코드 제출 결과
CodeUp 1297번 : 단면의 최대 넓이에서 코드 제출 결과

 

 

느낀 점

저는 수학적으로 생각하지 않고 구부릴 수 있는 만큼 다 구부려 본 다음

각 단면의 넓이를 비교해서 단면의 넓이가 최댓값일 때의 구부린 길이를 구해 출력했습니다.

 

그런데 예제에서 한 번 되돌아보니 구부릴 수 있는 최대 길이의 절반 정도의 부분일 때

단면의 넓이가 최댓값이 되네요.

이것을 사용하면 굳이 반복문을 사용하지 않고 수학적으로 풀 수 있을 것 같습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

※ 공감 버튼과 구독 버튼도 잊지 말고 꾹 눌러주시면 감사하겠습니다~👍👍

반응형

댓글