[단계별로 풀어보기] - 기본수학 1단계

양진혁·2022년 11월 4일
0

백준

목록 보기
7/21

1712_손익분기점

⭕풀이:

A, B, C = map(int, input().split())

if B >= C:  #손익분기점이 존재하지 않을 때는 고정비용과 상관 없이 가변비용(B)이 노트북의 판매가격(C)보다 크게 되면 존재하지 않는다. 그렇지 않고 판매가격(C)보다 낮은 경우에는 되게 많이 팔아야겠지만 손익분기점이 결국엔 생긴다.
    print(-1)
else:
    print(A//(C-B) + 1)  #처음 질문을 보고 판매량을 N으로 두고, 단순하게 식을 세우면 총 수입 = 고정비용 + 가변비용(A + B * N < C * N)이지만 손익분기점이 발생하는 때의 판매량을 식으로 나타내면 N= A/(C-B)이다. 하지만 이 식은 손익분기점인 때가 되는 것이고, 최초로 이익이 발생하는 시점은 이 식에서 판매량을 보다 하나 더 더해야 한다.

2292_벌집

⭕풀이:

N = int(input())  #주어지 벌집의 방 번호

nums_pileup = 1  #1번방을 간다고 해도 1개의 방을 거치므로, 방의 개수는 1개부터 시작
cnt = 1  #몇 개의 방을 거쳤는지 카운트
while N > nums_pileup:  #주어진 방의 번호가 1번방보다 크다면 아래 내용을 반복해라. => 작다면 멈추어라.
    nums_pileup += 6 * cnt  #1개의 방에서 입력받은 방으로 가야하므로, 방 n-1개를 지날 때마다 이전의 방 개수 + 6의 배수만큼의 방 호수들을 갈 수 있으므로 방의 개수는 방의 개수 + 방을 지나온 방의 개수(n - 1 = cnt)에 6을 곱한 값이다.
    cnt += 1  #지나쳐 온 방의 개수는 + 1이 된다.

print(cnt)



📌문제회고

  • 처음엔 벌집의 방들이 규칙을 가지고 n번을 거치면 += 6배수만큼의 방들을 n번만에 갈 수 있다는 사실을 알고,

  • room_list라는 리스트를 만들어 그곳에 6의 배수만큼 들어 있는 리스트들을 차례대로 두고, 주어진 값이 주어지면 이 값은 room_list에서 몇번째 리스트에 들어가 있을까 물어본 다음 그 리스트가 room_list에서의 위치값에 + 1을 할 생각이었습니다.
    꽤 잘 생각했다고 했는데 코딩으로 구현하는데 애를 먹었습니다.
    우선 N번방의 값이 주어지면 for문을 2번에 걸쳐 room_list에서 그 값을 찾아내야 하고, 해당 값이 들어가 있는 리스트의 위치값을 room_list에서 다시 찾아내야 한다는 생각을 갖고 있었지만, for문으로는 무한루프가 안될뿐더러 대신 while문을 사용해야 하기 때문에 실패했습니다,,

room_list = [[1], [2~7], [8,19],..]


1193 분수 찾기

⭕풀이:

x = int(input())
num_list = []

num = 0
num_count = 0

while num_count < x:
    num += 1
    num_count += num

num_count -= num

if num % 2 == 0:
    top = x - num_count
    under = num - i + 1
else:
    top = num - (x - num_count) + 1
    under = x - num_count

print(f"{top}/{under}")

문제파악


2869_달팽이는 올라가고 싶다

⭕풀이:

import math

A, B, V = map(int, input().split())  # A= 올라가는 길이, B= 떨어지는길이, V= 나무높이

day = math.ceil((V-A)/(A-B)) + 1
print(day)

#날짜(day)를 계산한는 식을 작성하기 전, 먼저 나무 높이를 기준으로 하는 식을 작성해보면 (A-B)*day +A = V와 같습니다.
#A만큼 올랐다 B만큼 떨어지기를 반복하기 때문에
#A-B의 거리만큼 올라가는 것을 day큼 반복하고, 마지막 날에는 A만큼 올라가고서 더 이상 떨어지지 않기 때문입니다.
#나무높이인 V를 기준으로 작성한 식을 응용하여 나무에 도달하기까지 걸린 기간을 구하면 위에 작성한 코드와 같습니다.
#나무높이에서 마지막 날에 올라간 거리를 뺀 수에서 A-B를 나누면 마지막에 A만큼 올라간 하루를 제외한 날짜를 구할 수 있습니다.



📌필요지식

1) math모듈의 ceil함수, floor함수

  • math모듈을 이용하면 수학과 관련된 함수들을 사용할 수 있습니다.
    ceil함수는 소수를 올림하는 정수를 반환하고,
    floor함수는 소수를 내림하는 정수를 반환할 수 있습니다.

10250_ACM 호텔



⭕풀이:

test_case = int(input())
for _ in range(test_case):
    H, M, N = map(int, input().split())
    num = N // H + 1  #방 호수는 주어진 순번 N값을 층수H로 나눈 값인 몫에 1을 더한 값이다.
    floor = N % H  #층 수는 주어진 순번 N값을 층수H로 나눈 나머지 값의 정수부분만큼이다.
    if N % H == 0:  #H가 N의 배수일 경우 나머지 값(=floor)이 0이 되므로
        num = N // H  #방 호수는 주어진 순번 N값을 층수H로 나눈 값인 몫이고,
        floor = H  #층 수는 H값의 배수 즉, 꼭대기 층으로 H값이다.
    print(f'{floor * 100 + num}')

2775_부녀회장이 될테야

⭕풀이:

T = int(input())
for _ in range(T):
    floor = int(input())
    num = int(input())
    f0 = [x for x in range(1, num)]  #0층의 리스트를 1부터 주어진 num의 값 -1만큼 x를 반복해 만든다. ex)num = 3이면, f0 = [1,2,3]이다.
    for k in range(floor):  #다음 나올 아래 내용을 k로 두고, k를 주어진 floor의 값만큼 반복해라.
        for i in range(1, num):  #i를 1부터 num - 1만큼 반복해라.
            f0[i] += f0[i-1]  #f0의 값은 f0의 값에 f0의 i-1번째 오는 값을 더한 값으로 업데이트된다. ex)floor =2, num = 3이고, 첫번째 for i문을 통해 f0을 반복했으면, f0[1]은 반복되기 전 f0의 1번째 있는 값에서 0번째 값은 반복을 통해 업데이트 됐으니 반복된(업데이트된) 첫번째 반복 f0의 0번째 값을 더한 값이 된다.
    print(f0[-1])  #num만큼 반복했으니 나열된 f0 리스트를 보면 마지막 값이 구하고자 하는 값이 된다.



📌필요지식


2839_설탕배달

⭕풀이:

N = int(input())

bag_cnt = 0
while N >= 0:  #주어진 설탕의 무게 N값이 0이 될 때까지 -3kg씩 해서 5의 배수까지 맞추고, -3kg을 한 번 할 때마다 봉지개수 bag_cnt에 1씩 더하는 반복을 할 것이다.
    if N % 5 == 0:  #주어진 설탕의 무게가 5의 배수일 경우,
        bag_cnt += (N // 5)  #봉지의 개수는 설탕의 총무게 N값을 5로 나눈 몫이다.
        print(bag_cnt)
        break
    N -= 3
    bag_cnt += 1
else:
    print(-1)

10757_큰 수 A+B

⭕풀이:

A, B = map(int, input().split())
print(A+B)



📌필요지식

1) arbitrary precision

  • 다른 언어(c언어)에서는 메모리가 커 error가 뜨지만, 파이썬은 오버플로우가 없기 때문에 터지지 않습니다.
  • 터지지 않는 이유로 arbitrary precision인데, 이는 사용할 수 있는 메모리양이 정해져 있는 기존의 fixed-precision과 달리, 현재 남아있는 만큼의 사용가능한 메모리를 모두 수 표현에 끌어다 쓸 수 있는 형태를 이야기하는 것 같습니다. 역시 잘 모르겠습니다.
profile
타이밀크티는 맛있습니다.

0개의 댓글