Processing math: 100%

python3로 푼 문제입니다

 

진법 변환 - 2745

ABC36=A362+B36+C360

원래 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로 나타낼 수 있음

예시를 보면

22=433=955=25 이와 같은데 3번 케이스를 살펴보면 다음과 같을 것

99=81

이런식으로 2→3→5→9 바뀜

점의 개수는 기존 점의 사이에 추가되기 때문에 n+(n1)=2n1 이와같이 표현 가능

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+6nd=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

  1. A와 V가 같을 때
  2. 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자리에서 올림한다고 함