728x90

5/ 29 파이썬 공부
1. 백준 1075 나누기
두 정수 N과 F가 주어진다. 지민이는 정수 N의 가장 뒤 두 자리를 적절히 바꿔서 N을 F로 나누어 떨어지게 만들려고 한다. 만약 가능한 것이 여러 가지이면, 뒤 두 자리를 가능하면 작게 만들려고 한다.
예를 들어, N=275이고, F=5이면, 답은 00이다. 200이 5로 나누어 떨어지기 때문이다. 
N=1021이고, F=11이면, 정답은 01인데, 1001이 11로 나누어 떨어지기 때문이다.
첫째 줄에 N, 둘째 줄에 F가 주어진다. N은 100보다 크거나 같고, 2,000,000,000보다 작거나 같은 자연수이다. 
F는 100보다 작거나 같은 자연수이다.
첫째 줄에 마지막 두 자리를 모두 출력한다. 한자리이면 앞에 0을 추가해서 두 자리로 만들어야 한다.

>>>코드

a= input()
b= int(input())
n = (int(a[-2:])-(int(a)%b))%b
if n<10:
    print('0%d' %(n))
else:
    print(n)



자 일단. n 과 f를 입력받는다.
그리고 n을 f로 나누어 나온 나머지를 n에서 빼서 나누어 쩔어지는 수를 만든다.
근데 이제 마지막 두 자리수가 가장 작아야 하므로, 문자열로 슬라이싱 해서 마지막 두 숫자를 자르고 
다시 숫자형으로 바꾸어서 f로 나눈 나머지를 구한다. 그게 만들 수 있는 가장 작은 숫자이다.
마지막으로 한자리 즉 10보다 작으면 앞에 0을 추가해서 두 자리로 만들고 아니면 그냥 출력한다.

2. 백준 1173 운동
영식이가 운동을 하는 과정은 1분 단위로 나누어져 있다. 매 분마다 영식이는 운동과 휴식 중 하나를 선택해야 한다.
운동을 선택한 경우, 영식이의 맥박이 T만큼 증가한다. 
즉, 영식이의 맥박이 X였다면, 1분 동안 운동을 한 후 맥박이 X+T가 되는 것이다. 
영식이는 맥박이 M을 넘는 것을 원하지 않기 때문에, X+T가 M보다 작거나 같을 때만 운동을 할 수 있다. 
휴식을 선택하는 경우 맥박이 R만큼 감소한다. 
즉, 영식이의 맥박이 X였다면, 1분 동안 휴식을 한 후 맥박은 X-R이 된다. 
맥박은 절대로 m보다 낮아지면 안된다. 따라서, X-R이 m보다 작으면 맥박은 m이 된다.
영식이의 초기 맥박은 m이다. 운동을 N분 하려고 한다. 
이때 운동을 N분하는데 필요한 시간의 최솟값을 구해보자. 운동하는 시간은 연속되지 않아도 된다.
첫째 줄에 다섯 정수 N, m, M, T, R이 주어진다.
첫째 줄에 운동을 N분하는데 필요한 시간의 최솟값을 출력한다.. 만약 운동을 N분 할 수 없다면 -1을 출력한다.

>>>코드

N, m, M, T, R = map(int, input().split())
n, i = m, 0
if m + T > M:
    print(-1)
else:
    while N != 0:
        if n + T > M:
            n -= R
            if n < m:
                n = m
            i += 1
        else:
            n += T
            N -= 1
            i += 1
    print(i)



3. 백준 1212 8진수 2진수
8진수가 주어졌을 때, 2진수로 변환하는 프로그램을 작성하시오.
첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다.
첫째 줄에 주어진 수를 2진수로 변환하여 출력한다. 수가 0인 경우를 제외하고는 반드시 1로 시작해야 한다.

>>>코드

n = int(input(), 8)
print(bin(n)[2:])



1) n진수를 10진수로 변환하기
int(숫자, n)

2) 10진수를 2진수로 변환하기
bin(숫자)[2:]

4. 백준 1225 이상한 곱셈
A×B를 계산하다 지겨워진 형택이는 A×B를 새로운 방법으로 정의하려고 한다.
A에서 한 자리를 뽑고 × B에서 임의로 한 자리를 뽑아 곱한다.
의 가능한 모든 조합 (A가 n자리, B가 m자리 수라면 총 가능한 조합은 n×m개)을 더한 수로 정의하려고 한다.
예를 들어 121×34는
1×3 + 1×4 + 2×3 + 2×4 + 1×3 + 1×4 = 28
이 된다. 이러한 형택이의 곱셈 결과를 구하는 프로그램을 작성하시오.
첫째 줄에 A와 B가 주어진다. 주어지는 두 수는 모두 10,000자리를 넘지 않는 음이 아닌 정수이다. 
수가 0인 경우에는 0만 주어지며, 그 외의 경우 수는 0으로 시작하지 않는다.
첫째 줄에 형택이의 곱셈 결과를 출력한다.

>>>코드

import sys
a, b = sys.stdin.readline().split()
n = 0
for i in a:
    for j in b:
        n += int(i)*int(j)
print(n)



import sys 와 pypy3를 사용해야 시간 초과가 안걸린다

5. 백준 12333 주사위
지민이는 주사위 던지기 게임을 좋아하여 어느 날 옆에 있는 동호를 설득하여 주사위 던지기 게임을 하자고 하였다. 
총 3개의 주사위가 있다. 그리고 이 주사위는 각각 S1(2 ≤ S1 ≤ 20), S2(2 ≤ S2 ≤ 20), S3(2 ≤ S3 ≤ 40)개의 면이 있다. (실제로는 주사위가 6개의 면이 있는 것이 정상이지만 특별한 주사위라 생각하자.)
문제는 세 개의 주사위를 동시에 던졌을 때 가장 높은 빈도로 나오는 세 주사위의 합을 구하는 것이다.
예를 들어, S1 = 3, S2 = 2, S3 = 3으로 주어질 때, 주사위1은 S1(3)개의 면이 있으므로 1, 2, 3의 눈을 가지고, 주사위2는 S2(2)개의 면이 있으므로 1, 2의 눈을 가지며, 주사위3은 S3(3)개의 면이 있으므로 1, 2, 3의 눈을 가진다. 이 때, 이 3개의 주사위를 던져서 눈의 합을 구하면, (1, 1, 1) = 3, (1, 1, 2) = 4, (1, 1, 3) = 5, ... , (3, 2, 1) = 6, (3, 2, 2) = 7, (3, 2, 3) = 8과 같은 합들을 얻을 수 있다. 이 때, 가장 많이 발생하는 합을 구하는 것이다.
입력 파일의 첫째 줄에 정수 S1, S2, S3가 주어진다.
출력 파일의 첫째 줄에 가장 높은 빈도로 나오는 세 주사위 합을 구하는 것이다. 
단 답이 여러개라면 가장 합이 작은 것을 출력한다.

>>>코드

a, b, c = map(int, input().split())
n = []
m, nm = 0, 0
for i in range(1, a+1):
    for j in range(1, b+1):
        for k in range(1, c+1):
            n.append(i+j+k)
for i in range(3, a+b+c):
    if n.count(i) > m:
        m = n.count(i)
        nm = i
print(nm)



6. 백준 1252 이진수 덧셈
두 개의 이진수를 입력받아 이를 더하는 프로그램을 작성하시오.
첫째 줄에 두 개의 이진수가 빈 칸을 사이에 두고 주어진다. 
각 이진수는 1 또는 0으로만 이루어져 있으며, 0으로 시작할 수도 있다. 또한 각 이진수의 길이는 80을 넘지 않는다.
첫째 줄에 이진수 덧셈 결과를 출력한다. 결과가 0인 경우를 제외하고는 출력되는 이진수는 항상 1로 시작해야 한다.

>>>코드

a, b = input().split()
a, b = int(a, 2), int(b, 2)
print(bin(a+b)[2:])



이러한 방법도 있지만 이진수 덧셈의 이론에 대해 배워보자

1) 이진수의 덧셈
일의 자리수 부터 더해서 2가 가되면 윗자리 수로 1을 넘기면 된다.

ex)
100101
000011 +
---------
101000

7. 백준 1297 TV 크기
김탑은 TV를 사러 인터넷 쇼핑몰에 들어갔다. 
쇼핑을 하던 중에, TV의 크기는 그 TV의 대각선의 길이로 나타낸 다는 것을 알았다. 
하지만, 김탑은 대각선의 길이가 같다고 해도, 실제 TV의 크기는 다를 수도 있다는 사실에 직접 TV를 보러갈걸 왜 인터넷 쇼핑을 대각선의 길이만 보고있는지 후회하고 있었다.
인터넷 쇼핑몰 관리자에게 이메일을 보내서 실제 높이와 실제 너비를 보내달라고 했지만, 관리자는 실제 높이와 실제 너비를 보내지 않고 그것의 비율을 보내왔다.
TV의 대각선 길이와, 높이 너비의 비율이 주어졌을 때, 실제 높이와 너비의 길이를 출력하는 프로그램을 작성하시오.
첫째 줄에 TV의 대각선 길이 D, TV의 높이 비율 H, TV의 너비 비율 W이 공백 한 칸을 사이에 두고 주어진다.
첫째 줄에 TV의 높이와 TV의 너비를 공백 한 칸을 이용해서 구분지은 후 출력한다. 만약, 실제 TV의 높이나 너비가 소수점이 나올 경우에는 그 수보다 작으면서 가장 큰 정수로 출력한다. (예) 1.7 -> 1

>>>코드

import math
d, h, w = map(float, input().split())
H = (((d**2)/(h**2+w**2))**0.5) * h
W = (((d**2)/(h**2+w**2))**0.5) * w
print('%.0f %.0f' %(math.floor(H), math.floor(W)))



간과한 것이 있었다.
그냥 %.0f를 사용하면 반올림을 시켜준다. 
그러나 문제에서 원하는 것은 반올림이 아니라 버림이기에 import math \n math.floor()를 사용해야 한다.

8. 백준 1333 부재중 전화
얼마전, Day Of Mourning의 새 앨범이 나왔고, 강토는 이 앨범을 들으려고 한다.
이 앨범에는 총 노래가 N곡이 들어있고, 모든 노래의 길이는 L초이다. 
그리고, 노래와 노래 사이에는 5초 동안 아무 노래도 들리지 않는 조용한 구간이 있다.
강토가 앨범의 첫 곡을 듣는 순간이 0초이다. 그리고 그 0초부터 강토의 전화벨이 울리기 시작한다. 
전화벨은 D초에 1번씩 울리며, 한 번 울릴 때 1초동안 울린다.
강토는 락 스피릿을 진심으로 느끼기 위해서 볼륨을 매우 크게 하고 듣기 때문에, 노래가 나오는 중에는 전화벨 소리를 듣지 못한다.
만약, 전화벨이 노래가 시작되는 순간 울린다면, 강토는 전화를 받지 못한다. 
또, 전화벨이 노래가 끝나는 순간 같이 끝난다면, 강토는 전화를 받을 수 없다.
강토는 앨범을 1번만 듣는다. 즉, 모든 앨범 수록곡을 다 듣고 난 후에는 전화벨을 들을 수 있다.
강토가 전화벨을 들을 수 있는 가장 빠른 시간을 구하는 프로그램을 작성하시오.
첫째 줄에 세 정수 N, L, D가 공백을 사이에 두고 주어진다.
첫째 줄에 강토가 전화벨을 들을 수 있는 가장 빠른 시간을 출력한다.

>>>코드

N, L, D = map(int, input().split())
total = L*N + 5*(N-1)
t, i = 0, 0
while t+ i*(L+5) < total:
    t += D
    if t >= L+5:
        i = i + t//(L+5)
        t = t%(L+5)
    if t >= L:
        break
print(i*(L+5) + t)



중간에 코드 순서를 헷갈려서 늪에 빠졌었다. 잘 빠져나온 모습

9. 백준 1350 진짜 공간
어떤 파일 시스템에는 디스크 공간이 파일의 사이즈와 항상 같지는 않다. 이것은 디스크가 일정한 크기의 클러스터로 나누어져 있고, 한 클러스터는 오직 한 파일만 이용할 수 있기 때문이다.
예를 들어, 클러스터의 크기가 512바이트이고, 600바이트 파일을 저장하려고 한다면, 두 개의 클러스터에 저장하게 된다. 두 클러스터는 다른 파일과 공유할 수 없기 때문에, 디스크 사용 공간은 1024바이트가 된다.
파일의 사이즈와 클러스터의 크기가 주어질 때, 사용한 디스크 공간을 출력하는 프로그램을 작성하시오.
첫째 줄에 파일의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 
둘째 줄에는 파일의 크기가 공백을 사이에 두고 하나씩 주어진다. 
파일의 크기는 1,000,000,000보다 작거나 같은 음이 아닌 정수이다. 마지막 줄에는 클러스터의 크기가 주어진다. 
이 값은 1,048,576보다 작거나 같은 자연수이다.
첫째 줄에 사용한 디스크 공간을 출력한다.

>>>코드

n = int(input())
file = list(map(int, input().split()))
cluster = int(input())
N = []
for i in range(n):
    if file[i]%cluster == 0:
        N.append(file[i]//cluster)
    else:
        N.append((file[i]//cluster) +1)
print(sum(N)*cluster)
728x90

+ Recent posts