python3로 푼 문제입니다
진법 변환 - 2745
$ABC_{36} = A36^2+B36+C*36^0$
원래 ord를 사용하면 알파벳의 경우 A부터 1씩 더해짐,
원래 순서 = 알파벳 - ord(A)
10진법 넘어가는 진법에서 값 = 알파벳 - ord(A) + 10
→ A가 10이기 때문에 10을 더해줌
이때 중요한건 알파벳 말고도 숫자가 쓰일수도 있기때문에 숫자인지 알파벳인지 구분을 해줘야함
python에서는 다음과 같다고 함
isalpha : 알파벳인지 확인
isdigit : 숫자인지 확인
isalnum : 알파벳 or 숫자인지 확인
num, formation = input().split()
ans = 0
for i in range(len(num)):
if num[i].isalpha():
ans += (ord(num[i]) - ord('A') + 10)*pow(int(formation), len(num)-i-1)
else:
ans += int(num[i])*pow(int(formation), len(num)-i-1)
print(ans)
진법 변환2 - 11005
a = 60466175
b = 36
while True:
if a == 0:
break
else:
print(a, a % b)
a = a // b
나머지값을 구한 후 차례대로 해당 진법으로 바꾸면 됨
이때 첫번째 나머지를 구하고 N//B를 한 값으로 다음 나머지를 구하면됨
10이 넘으면 알파벳 대문자로 표현하고 아니면 숫자 그대로 출력되게하며 while문의 순서 그대로하면 순서가 반대로 되어서 나오기 때문에 거꾸로 출력되게 해줌
num, formation = input().split()
num, formation = int(num), int(formation)
ans = ''
while True:
if num == 0:
break
else:
c = num % formation
if c >= 10:
ans += chr(c + 55)
else:
ans += str(c)
num = num // formation
print(ans[::-1]
세탁소 사장 동혁 - 2720
주어진 테스트케이스만큼 for문을 돌려서 가장 큰 단위부터 차례로 나머지연산을 해주면 동전의 개수를 최소로 할 수 있음
case = int(input())
for _ in range(case):
money = int(input())
coin = [25, 10, 5, 1]
for i in coin:
print(money // i, end=' ')
money %= i
중앙 이동 알고리즘 - 2903
점의 개수와 그림을 보면 한줄에 있는 점의 개수와 가로줄의 수가 같아 총 점의 개수를 n*n로 나타낼 수 있음
예시를 보면
$2^2=4 \\ 3^3 = 9 \\ 5^5=25$ 이와 같은데 3번 케이스를 살펴보면 다음과 같을 것
$9^9=81$
이런식으로 2→3→5→9 바뀜
점의 개수는 기존 점의 사이에 추가되기 때문에 $n+(n-1)=2n-1$ 이와같이 표현 가능
import sys
m = int(sys.stdin.readline().rstrip())
n = 2
for i in range(m):
n = 2*n - 1
print(n**2)
벌집 - 2292
그림을 보고 정리해보면 아래와 같음
a = [2,3,4,5,6,7]
b = [8,9,10,11,12,13,14,15,16,17,18,19]
c = [20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37]
d = [38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61]
e = [62,63,64,65,66,67,68,69,70,...]
정육각형 모양으로 각 겹마다 나누면 다음과 같은데 이때 크기가 늘어날수록 숫자의 개수가 6개씩 더해짐
$c=2+6n \\ d=6n$ 이때 i는 리스트의 첫번째 수, d는 리스트 안의 숫자 개수
위를 이용해서 코드 짬
이때 2,8,20,38 등 2+6n이 되는 수가 리스트의 첫번째 요소이므로 입력받은 수가 2+6n 이상일 때 횟수를 1씩 더해줘야 올바르게 나옴
import sys
n = int(sys.stdin.readline().rstrip())
a = 2
i = 0
while n>=a:
i += 1
a += 6*i
print(a)
print(i+1)
분수찾기 - 1193
지그재그 순서로 순서를 부여하기 때문에 대각선으로 따졌을 때 해당 줄이 짝수인지 홀수인지만 따지면 됨
왜나면 배열이 1부터 해당 줄의 숫자개수만큼 늘어나고 거꾸로 줄어드는 형태이기 때문. 그리고 지그재로 움직이기 때문에 대각선 줄이 짝수일 때와 홀수일 때 두가지로 구분해야함. 이때 각 줄의 숫자 개수는 대각선 몇번째 줄인지와 동일
(다음줄은 ->로 구분, 같은줄에서 다음순서를 나타낼 때는 -로함)
분수: 1/1 -> 1/2 - 2/1 -> 3/1 - 2/2 - 1/3 -> …
분자: 1-> 1 - 2 -> 3 - 2 - 1 ->...
분모: 1-> 2 - 1 -> 1 - 2 - 3 ->...
그럼 주어진 수 X를 가지고 몇번째 줄인지를 알면됨
import sys
x = int(sys.stdin.readline().rstrip())
line, cmp = 0, 0
while x>cmp:
line += 1
cmp += line
if line%2==0:
nume = line-(cmp-x)
deno = cmp-x+1
else:
nume = cmp-x+1
deno = line-(cmp-x)
print(nume ,'/', deno, sep="")
달팽이는 올라가고 싶다 - 2869
문제에서 범위가 다음과 같다고 나옴
1 ≤ B < A ≤ V ≤ 1,000,000,000
- A와 V가 같을 때
- A가 V보다 작을 때
위 두 케이스로 나눠서 코드를 다시 짬
import sys
import math
a, b, v = map(int, sys.stdin.readline().rstrip().split())
if a == v and a//b==0:
print(math.ceil((v-b)/(a-b)+1))
else:
print(math.ceil((v-b)/(a-b)))
math.ceil(number)은 숫자 number를 소수점 1자리에서 올림한다고 함
'PS > BOJ' 카테고리의 다른 글
단계별: 시간 복잡도 (24262, 24263, 24264, 24265, 24266, 24267, 24313) (python3) (1) | 2023.12.02 |
---|---|
단계별: 약수,배수와 소수 (5086, 2501, 9506, 1978, 2581, 11653) (python3) (1) | 2023.11.28 |
명령 프롬프트 - 1032 (python3) (1) | 2023.11.23 |
색종이 - 2563 (python3) (1) | 2023.10.31 |
9/4 ~ 9/10 (Clang) (0) | 2023.09.09 |