백준 알고리즘 7단계 (기본수학1)

김형준·2022년 4월 10일
0
  • 새롭게 배운 내용

1) 1712번 손익분기점

c-b가 0인 상황을 고려하지 못해 런타임 에러를 발생 시켰다.
c-b가 0일 경우 분모에 0이 들어가 division by zero 에러를 발생 시킨다. 주의!

a, b, c = map(int, input().split())

if c-b <= 0:
    print('-1')
else:
    print(int(a/(c-b) + 1))

2) 2292번 벌집 문제

각 차원의 마지막 수는 1 + 6 n (n + 1)/2이다. (등차수열의 합)
따라서 입력 값이 마지막 수와 비교하여 같거나 작아지는 경우를 찾아서 답을 출력했다.

N = int(input())
i = 1

while True:
	# 입력한 수와 각 차원의 마지막 수와 비교하여 입력한 수가 같거나 작을 때 반복문을 벗어난다.
    if N <= 3 * (i + 1) * i + 1:
        break
    i+=1

# N이 1인 경우는 예외 처리를 해줘야 한다. ( 1로 출력되어야 하기 때문)
if N == 1:
    print(1)
else:
    print(i+1)

3) 1193번 분수찾기

X = int(input())

# 입력 값이 몇번째 사이클에 포함되는 지 체크
# 여기에서 사이클이란 d가 1, a1이 1인 등차수열의 합
i = 1
while True:
    sum = i * (i + 1) / 2
    if X <= sum:
        break
    i += 1

# i가 홀수인지 짝수인지 판별 (이에 따라 분모 분자의 값이 뒤바뀜)
if i % 2 == 0:
    b = sum - X + 1
    a = (i+1) - b
elif i % 2 == 1:
    a = sum - X + 1
    b = (i+1) - a
# 정답 출력
print(str(int(a)) + '/' + str(int(b)))

4) 2869번 달팽이는 올라가고 싶다..

import math

A, B, V = map(int, input().split())
# 낮까지의 움직임이 막대기의 크기와 같은 경우를 올림하여 추출
i = math.ceil((V-A) / (A-B))

# 만약 올림으로 인해 i번째에서 이미 정상에 올랐는지 체크!
if V - (A - B)*(i - 1) - A <= 0:
    print(i)
# 아닐 경우 i+1번째에서 정상에 오르게 된다.
else:
    print(i+1)

5) 10250번 ACM호텔

import math
T = int(input())

for i in range(T):
    H, W, N = map(int, input().split())
    #호수 계산
    room = math.ceil(N / H)
    #층수 계산
    floor = N - (H * (room-1))
    #호수가 10보다 작을 시 앞에 0붙여주기
    strRoom = str(room)
    if room < 10:
        strCycle = '0' + strRoom
    print(str(floor) + strRoom)

6) 2775번 부녀회장이 될테야!

T = int(input())

for i in range(T):
    k = int(input())
    n = int(input())
    # 0층의 n호실까지의 인원수를 리스트에 담아줌
    calcList = list(range(1, n+1))
    # 반복문을 돌며 한층 위의 인원수를 담아줄 리스트
    changeList = list()
    # 입력한 층 수 만큼 반복한다.
    for t in range(k):
    	# 1부터 호수 + 1 까지 반복
        for r in range(1, len(calcList)+1):
            calc = 0
            # 호수만큼 이전 층의 인원수를 모두 더해주고 changeList에 넣어준다
            for d in range(r):
                calc += calcList[d]
            changeList.append(calc)
        # 0층 리스트를 이전 층 리스트로 바꿔준다. 그 후 changeList 빈 리스트로 초기화
        calcList = changeList
        changeList = list()
    print(calcList[n-1])

7) 2839번 설탕 배달 (다이나믹 프로그래밍, 그리디 알고리즘, 수학)

아직 알고리즘 이론을 공부하지 않았기 때문에, 최대한 알고 있는 지식을 바탕으로 풀었다.

N = int(input())

# 아래에 담긴 경우가 가장 적은 수의 봉투를 가져갈 수 있는 경우
five = int(N / 5)
three = int((N - (5 * five)) / 3)
ans_list = list()

# 만약 위 조건을 충족하지 못할 경우 
# 5와 3의 배수의 합인 설탕 봉투 수들을 리스트에 담아 리스트 내 최솟값을 출력한다.
if (N - (5 * five)) % 3 != 0:
    i = 0
    while True:
        if (N - (5 * i)) % 3 == 0:
            three = int((N - (5 * i)) / 3)
            # 3의 배수가 음수가 아닐 경우만 추가 (체크)
            if three > 0:
                ans_list.append(three + i)
        if N - (5 * i) < 0:
            if len(ans_list) != 0:
                print(min(ans_list))
                break
            else:
                print(-1)
                break
        i += 1
else:
    print(five + three)

8) 10757번 큰 수 A+B

다른 언어에서는 메모리가 터져 에러가 발생한다고 한다.
파이썬은 왜 메모리가 터지지 않는까?

그 이유는 파이썬은 Arbitrary-precision arithmetic을 사용하여 오버플로우가 없기 때문이다.

arbitrary-precision은 사용할 수 있는 메모리양이 정해져 있는 기존의 fixed-precision과 달리, 현재 남아있는 만큼의 가용 메모리를 모두 수 표현에 끌어다 쓸 수 있는 형태

출처: https://ahracho.github.io/posts/python/2017-05-09-python-integer-overflow/

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

print(A + B)
profile
BackEnd Developer

0개의 댓글