알고리즘 마라톤 3일차
13번
기냥 무식하게 1식 늘리면서 '666'이 포함되어 있는지 확인하는 브루스 포스 문제
count = int(input())
end_num = 666
while True:
if '666' in str(end_num):
count -= 1
if count == 0:
break
end_num += 1
print(end_num)
14번
시간 초과 코드
A, B, V = map(int, input().split())
count = 0
while True:
count += 1
V = V - A
print(V)
if V <= 0:
break
else:
V = V + B
print(count)
a,b,v = map(int,input().split())
k = 0 # 올라가는 데 걸리는 일수
d = 0 # 올라간 높이
while 1:
k+=1
if a*k-b*(k-1)>=v:
break
print(k)
여기서 if 문을 k만 남도록 정리하면 k >= (v-b) / (a-b)
가 된다.
a,b,v = map(int,input().split())
k = (v-b)/(a-b)
print(int(k) if k == int(k) else int(k)+1) #삼항연산자
답이 둘 중 하나인 이유는 분수가 나누어 떨어지지 않는 경우는 하루가 더 걸리는 거나 마찬가지이기 때문이다. (4.1일은 결국 5일이니까)
15번
약수가 모두 주어지기 때문에 가장 작은 약수와 가장 큰 약수를 곱하면 진짜 수를 구할 수 있다.
cnt = int(input())
aliquot_list = list(map(int, input().split()))
max_num = max(aliquot_list)
min_num = min(aliquot_list)
print(max_num * min_num)
16번
유클리드 호제법을 알면 간단해진다.
두 수의 최대공약수는 두 수 중 작은 수와 두 수 중 큰 수에서 작은 수를 나눈 나머지의 최대공약수와 같다.
gcd(24, 18) = gcd(18, 6) = gcd(6, 0)
에서 작은 수가 0이 되는 순간의 큰 수가 바로 최대공약수다.
최대공약수를 구하면 최소공배수는 두 수를 곱한 값을 최대공약수로 나누어주면 끝이다.
a, b = map(int, input().split())
def gcd(x, y):
mod = x % y
while mod > 0:
x = y
y = mod
mod = x % y
return y
def lcm(x, y):
return x * y // gcd(x, y)
print(gcd(a, b))
print(lcm(a, b))
17번
case = int(input())
for i in range(case):
h, w, n = map(int, input().split())
ho = n // h + 1
floor = n % h
if n % h == 0:
ho = n // h
floor = h
print(str(floor * 100 + ho))
18번
import math
m, n = map(int, input().split())
def isPrime(num):
if num == 1:
return False
else:
# n = int(math.sqrt(num))
n = int(num**0.5)
for i in range(2, n+1):
if num % i == 0:
return False
return True
for i in range(m, n+1):
if isPrime(i):
print(i)
19번
재귀 문제다. 가장 단순한 2개의 원판을 가지고 생각해보면 맨 위의 원판이 두 번째 보조 기둥으로 이동하고, 그 다음 첫 번째 시작 기둥에 남은 원판이 세 번째 목표 기둥으로 이동한 뒤, 보조 기둥에 위치한 원판을 세 번째 목표 기둥으로 옮기면 끝이 난다. 이게 한 사이클이다.
정리하면, 1 -> 2, 1 -> 3, 2 -> 3 사이클이다.
여기서 원판의 갯수만 점점 늘어나는 것 뿐이다.
자 이제 함수 호출 순서를 따져보면
입력 : hanoi(2, 1, 3)
hanoi(1, 1, 2) → print(1, 2)
print(1, 3)
hanoi(1, 2, 3) → print(2, 3)
이게 끝이다.
disk = int(input())
def hanoi(disk, a, b):
if disk > 1:
hanoi(disk-1, a, 6-a-b) # 보조 기둥으로 옮기기
print(a, b) # 목표 기둥으로 옮기기
if disk > 1:
hanoi(disk-1, 6-a-b, b) # 보조 기둥에서 목표 기둥으로 옮기기
print(2 ** disk-1) # 총 이동 횟수
hanoi(disk, 1, 3) # 3개의 원판을 기둥 1에서 기둥 3으로 옮기겠다.
20번
람다식을 이용하면 간단해진다. 람다식은 별도로 공부를 좀 해야겠다.
dot_cnt = int(input())
dot_list = []
for i in range(dot_cnt):
dot_list.append(list(map(int, input().split())))
dot_list.sort(key=lambda x: (x[1], x[0]))
# print(dot_list)
for i in dot_list:
print(i[0], i[1])
Author And Source
이 문제에 관하여(알고리즘 마라톤 3일차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@seanstainability/알고리즘-마라톤-3일차저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)