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

  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자리에서 올림한다고 함