[BAEKJOON] 8단계_일반 수학1 본문

IT/코테문제

[BAEKJOON] 8단계_일반 수학1

호랑구야 2023. 10. 27. 09:00

 

julia319 정보

시도했지만 맞지 못한 문제

www.acmicpc.net

 

2745번 진법 변환

파이썬 내장 함수 중 int(num, base)를 활용하면 문자건 숫자건 base에 진법을 넣으면 10진수로 변환해준다. 이때  base에는 0, 2~36까지 입력할 수 있다.

N, B = input().split()
B = int(B)

# int 함수의 두 번째 인자는 첫 번재 인자가 어떤 진법인지 표시하는데 사용된다.
N = int(N, B)

print(N)
  • int 함수를 사용하지 않는 방법

문자열의 진법값울 자릿수로 거듭제곱하고, 그 자리에 있던 값을 곱한 것을 더하는 방법으로 숫자를 구한다.

N, B = input().split()
B = int(B)

ans = 0

# 문자열은 1의 자리부터 역순으로 하나씩 늘어가고
# enmuerate를 활용해 갯수를 0부터 하나씩 늘어간다.
for num, i in enumerate(N[::-1]):
    # 주어진 진법에 문자열의 갯수 0부터 끝까지 거듭 제곱해준다.
    dem = B ** num
    # 만약 문자가 알파벳이라면 유니코드값에서 55를 뺀 값을 활용한다.
    if i.isalpha():
        n = ord(i) - 55
    # 만약 숫자라면 int로 변환
    else:
        n = int(i)
    
    # 진법과 자릿수를 고려한 dem에 그 자리에 위치한 숫자값을 곱한 것을 전체 숫자 값에 더해준다.
    ans += dem * n
        
print(ans)

 

11005번 진법 변환 2

9보다 큰 수의 경우 문자로 표현하기 위해 chr() 함수를 활용했다. 진법으로 나눈 나머지에 55를 더해야 문자 A~Z를 활용할 수 있다. 결과값의 뒷자리부터 계산하고 있으므로 이어붙일 때 자리를 주의해야 한다. 계산할 값을 진법으로 나눈 것의 몫으로 갱신한다.

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

ans = ''
# 계속 나눌 변수, 초기값은 주어진 입력값 N
tmp = N

while(True):
    tmpMod = tmp % B
    # 9보다 큰 나머지는 문자로 표현해야한다
    if tmpMod > 9:
        # 10일 경우 A가 나와야 하므로 나오는 숫자에 +55를 한다. 
        tmpMod = chr(tmpMod + 55)
    else:
        # 일반 숫자일 경우 문자로 변환한다.
        tmpMod = str(tmpMod)
    # 일의 자리부터 계산되므로 새로 계산한 것을 원래 것에 앞으로 이어붙인다.
    ans = tmpMod + ans
    
    # 만약 계산하는 것의 몫이 0이 된다면 전체 계산이 끝났으므로 break
    if tmp // B == 0:
        break;
    # 다음 계산할 것을 tmp를 주어진 진법으로 나눈 몫으로 갱신한다.
    tmp = (tmp // B)

print(ans)

 

 

2720번  세탁소 사장 동혁

나누기의 몫과 나머지를 잘 활용하면 쉽게 해결할 수 있다.

T = int(input())
# cent 단위로 입력되므로 동전의 단위도 동일하게 변경한다.
# 입력된 순서는 Q, D, N, P 순서다.
Unit = [25, 10, 5, 1]

for _ in range(T):
    # 거슬러줄 동전의 종류가 Q, D, N, P 순서로 입력된다.
    Coin = []
    change = int(input())
    # 동전 단위만큼 반복한다.
    for u in Unit:
        # 동전 단위만큼 나눈 것의 몫이 거슬러줄 동전의 가장 큰 단위
        Coin.append(change // u)
        # 앞의 동전을 뺀 만큼인, 나머지를 다시 계산할 change에 배정한다.
        change %= u
    for c in Coin:
        print(c, end = ' ')
    print()

 

2903번 중앙 이동 알고리즘

점의 숫자를 세로로 세보면, 2의 제곱, 3의 제곱, 5의 제곱, 9의 제곱의 형태다. 정사각형이므로 제곱으로 나올 뿐이고, 일반적인 계차수열이다.

N = int(input())

# 점의 갯수가 초기 4, 이후 9, 25, 81, ... 로 계차수열의 제곱 형태를 띄고 있다
# (a + sigma(b)from 0 to n-1) ** 2

# a = 2
# dot_1 = (a + (2 ** 0)) ** 2
# dot_1 = (a + (2 ** 1 + 2 ** 0)) ** 2
# dot_N = (a + (2 ** (n-1) + 2 ** (n-2) + ... + 2 ** 1 + 2 ** 0)) **2

a = 2
b = 0
for n in range(N):
    b += 2 ** n
ans = (a + b) ** 2

print(ans)

 

2292번 벌집

지나가는 방의 갯수와 레벨의 변화가 동일하다는 것을 이해해야 한다. 그 수가 어느 레벨에 있는가가 지나간 방의 수와 동일하다.

N = int(input())

# 방을 지나칠 때마다 레벨이 하나씩 오르기 때문에
# 어떤 레벨에 있는가가 지나가는 방의 갯수와 동일하다

# 현재 레벨, 초기값은 1
level = 1

# 레벨 별 방의 최대 수, 초기값 1
HiveNum = 1

while(True):
    # 만약 입력값이 현재 레벨의 방 최대 수보다 작거나 같다면
    # 루프를 종료한다.
    if N <= HiveNum:
        break;
    # 레벨이 오를 때 마다 더해지는 방의 수가 6의 배수이다.
    # 1 + 6) +12) +18) +24) ...
    HiveNum += 6 * level
    # 레벨을 하나 올린다.
    level += 1

print(level)

 

1193번 분수찾기

층별로 층만큼의 칸이 존재한다. 1층에는 1칸, 2층에는 2칸 등이므로, 입력값이 몇 층에 있는지 확인하고, 그 층의 첫 번째 칸과 입력값 차이만큼 이동하면 된다. 이때 층이 짝수면 분모는 그 층의 값에서 감소하는 형태고, 분자는 1에서 증가하는 형태다. 따라서 그 차이만큼을 더하고 빼주면 된다.

X = int(input())

# 층, 층과 층에 존재하는 칸의 수가 같다.
level = 1
# 층의 첫 번째 칸
levelStart = 1

while(True):
    # 만약 층과 층의 첫 번째 칸을 더한 것이 입력값보다 크다면 break
    if (level + levelStart) > X:
        break
    # 현재 층의 첫 번째 칸을 다음 층의 첫 번째 칸으로 변경
    levelStart += level
    # 현재 층을 바꿈
    level += 1
        
# 현재 층에서 입력값까지 움직여야하는 정도
diff = X - levelStart

# 만약 층이 짝수라면 분모를 큰 수부터 진행한다.
# 홀수라면 자리를 바꾼다.
if level % 2 == 0:
    # 현재 층에서 차이만큼 이동
    den = level - diff
    # 분모 값과 분자 값을 더하면 층 값에 1을 더한 값.
    num = 1 + diff
else:
    num = level - diff
    den = 1 + diff
    
print('{}/{}'.format(num, den))

 

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

시간제한이 있을 때는 반복문을 곱하기와 나누기가 들어간 변수 선언으로 바꾸면 된다.

import math
A, B, V = map(int, input().split())

# remainders = V
# day = 1
# while(True):
#     remainders -= A
#     if remainders <= 0:
#         break;
#     remainders += B
#     day += 1
# V - day * A + (day - 1) * B <= 0
# 날짜란 소수점이 없으므로, 소수점 존재시 무조건 올림처리
day = math.ceil((V - B) / (A - B))

print(day)

 

반응형
Comments