코딩테스트/백준) 단계별로 풀기

백준- 단계별로 풀어보기| 8단계- 일반 수학1

영최 2023. 4. 6. 02:29
728x90
단계 문제 번호 제목 내 코드 코드 비교
1 2745 진법 변환 NOTATION = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'

num,n  = input().split()
n = int(n) 
sum = 0
for i in range(len(num)):
    change_num = int(NOTATION.index(num[i])) 
    new_idx = len(num)-1-i
    sum += change_num * (n ** new_idx)
print(sum)

num,n  = input().split()

print(int(num, int(n)))
int(숫자, 진수)로 간단하게 10진수로 나타낼 수 있다.

문자열은 인덱스로 값을 바꿀 수 없다!! str[0] = 1
그래서 새로운 변수 change_num에 담았다.

그리고 런타임에러는 type이 정수가 아닌데 계산할 때 발생할 수 있으니
항상 타입에 유의하자!!
2 11005  진법 변환 2 NOTATION = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'

num, n = input().split()
num, n =  int(num), int(n)
st = ''
while(num > 0):
    try:
        st += NOTATION[num % n]
        num = num // n
    except:
        break
st = st[::-1]
print(st)
 
세상에.. input 값들을 int()처리 안해줘서 런타임에러 난 것이었다.
3 2720 세탁소 사장 동혁 quarter = 25
dime = 10
nickel = 5
penny = 1

n = int(input())
for i in range(n):
    exchange = int(input())
    q_num =  exchange // quarter
    d_num =  (exchange % quarter) // dime
    n_num = (exchange % quarter % dime) // nickel
    p_num = (exchange % quarter % dime % nickel) // penny
    print(q_num, d_num, n_num, p_num)
 
 
4 2903 중앙 이동 알고리즘 f = [0 for i in range(16)]
f[0] = 4

n = int(input())
for i in range(n+1):
    if i > 0:
        f[i] = int((2*(f[i-1]**0.5) -1)**2)
        
print(f[n])
#(2^n + 1)^2 

print((2**int(input())+1)**2)
f = [0 for i in range(16)] 여기서 16으로 안해서 (조건 1~15) 런타임 에러 떴었다.

그리고 math.sqrt로 안해도 **0.5로 루트 계산 가능하다

n은 1부터 인데 0까지 포함시키려고 하다보니 너무 어렵게 푼것 같다..
어떤 수의 제곱이라는 걸 확인하면, 조건을 보고 규칙을 세우자

[문제 풀 때 설계한 노트]
# n =0    n=1         n=2         n=3 
# 2*2   (2+1)*(2+1)  (3+2)*(3+2) (5+4)*(5+4) 
# (sqrt(f(n-1))+sqrt(f(n-1))-1)^2
# (2sqrt(f(n-1)) -1)^2
# f(0) = 4
# f(n) = (2sqrt(f(n-1)) -1)^2
5 2292 벌집 n  =  int(input())

i = 1
last_num = 1
while(n > last_num):
    last_num += 6*i
    i += 1
print(i)
 
[문제 풀 때 설계한 노트]
# 1    마지막 수: last_num =1  지나갈 방 개수: i =1   
# 2~7   last_num = last_num+6*1   / i =2 
# 8~19  last_num = last_num + 6*2   / i = 3 
# 20 ~37 last_num = last_num + 6*3  /  i = 4
6 1193 분수찾기 n =  int(input())
i = 1
last_num = 1
while(n > last_num):
    i += 1  
    last_num = last_num + i  
n2 = last_num - n 
if (i%2!=0):
    print(f'{n2+1}/{i-n2}')
else:
    print(f'{i-n2}/{n2+1}')
 
[문제 풀 때 설계한 노트]
# 1. 대각선 몇 번째(i)인지
# last_num= 1      /i = 1
# last_num= 1+2    /i = 2
# last_num= 1+2+3  /i = 3

# 2. i 가 짝수 일때 분수 (홀수면 반대)
# 0 -> 1/i
# 1 ->  2/i-1
# 4 ->   5/i-4 
# n2 ->   n2+1 / i-n2
7 2869 달팽이는 올라가고 싶다 #시간 초과
a,b,v = map(int,input().split())

i = 0
last = 0
while(v > last ):
    i += 1     
    last += a
    if(v <=last):
        break
    last -= b
print(i)  
import math
a,b,v = map(int,input().split())
day = (v-b)/(a-b)
print(math.ceil(day))
시간 초과 -> 반복문으로 풀지 말것

도달하는 날을 x일이라고 했을 때, 총 올라가는 횟수는 x번, 내려오는 횟수는 (x-1)번이 될 것이다.


이를 바탕으로 식을 세워보면
Ax - B(x-1) = V 가 될 것이고, 이를 x에 대한 식으로 정리한다면
x = (V-B)/(A-B) 가 될 것이다.
8 10757 큰 수 A+B A, B = map(int, input().split())
print(A+B)
 
파이썬은 큰수의 덧셈도 상관 없다.
728x90