입력
첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)
출력
첫째 줄에 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 출력한다.
import sys
input = sys.stdin.readline
N = int(input())
N_list = list(map(int,input().split()))
Result_list = [ 0 for _ in range(N) ]
N_list = sorted(N_list)
Result=0
for i in range(N):
for j in range(i+1):
Result_list[i] += N_list[j]
for i in range(N):
Result += Result_list[i]
print(Result)
11047 동전 0
문제
준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.
동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)
둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
출력
첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
coin_list = [ int(input()) for _ in range(N)]
coin_index = N-1
result = 0
while(True):
if K == 0:
break
elif K - coin_list[coin_index] < 0: # 뺄 수 없을 때
coin_index -= 1 # coin_index를 -1하고 continue
continue
else: # 뺄 수 있을 때
quotient = K//coin_list[coin_index] # 남은 값을 동전으로 나눈 몫
result += quotient
K -= quotient * coin_list[coin_index]
coin_index -= 1
continue
print(result)
##4796 캠핑
등산가 김강산은 가족들과 함께 캠핑을 떠났다. 하지만, 캠핑장에는 다음과 같은 경고문이 쓰여 있었다.
캠핑장은 연속하는 20일 중 10일동안만 사용할 수 있습니다.
강산이는 이제 막 28일 휴가를 시작했다. 이번 휴가 기간 동안 강산이는 캠핑장을 며칠동안 사용할 수 있을까?
강산이는 조금 더 일반화해서 문제를 풀려고 한다.
캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다. 강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까? (1 < L < P < V)
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.
출력
각 테스트 케이스에 대해서, 강산이가 캠핑장을 최대 며칠동안 사용할 수 있는지 예제 출력처럼 출력한다.
import sys
input = sys.stdin.readline
case_cnt = 0
while(True):
case_cnt += 1
L, P, V = map(int, input().split())
# L,P,V가 모두 0일 시, 프로그램 종료
if L == 0 and P == 0 and V == 0:
break
# 총 휴가를 P로 나누고, 사용가능 한 일 수인 L * 몫을 result에 저장한다
quotient = V // P
result = quotient * L
# 남은 휴가가 L보다 클 경우 L을 result에 더해주고,
# 작을 경우 남은 휴가를 result에 더해준다.
if V - (quotient * P) > L:
result += L
else:
result += V - (quotient * P)
print("Case %d:"%case_cnt,result)
##1439 뒤집기
다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다. 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.
예를 들어 S=0001100 일 때,
전체를 뒤집으면 1110011이 된다.
4번째 문자부터 5번째 문자까지 뒤집으면 1111111이 되어서 2번 만에 모두 같은 숫자로 만들 수 있다.
하지만, 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 한 번에 0000000이 되어서 1번 만에 모두 같은 숫자로 만들 수 있다.
문자열 S가 주어졌을 때, 다솜이가 해야하는 행동의 최소 횟수를 출력하시오.
입력
첫째 줄에 문자열 S가 주어진다. S의 길이는 100만보다 작다.
출력
첫째 줄에 다솜이가 해야하는 행동의 최소 횟수를 출력한다.
import sys
input= sys.stdin.readline
bit_list = list(map(int, input().strip()))
len = bit_list.__len__()
cnt = 0
for i in range(1,len):
if bit_list[i] == bit_list[i-1]:
continue
else:
cnt += 1
if cnt%2 == 0:
print(cnt//2)
else:
print(cnt//2 + 1)
##1080 행렬
문제
0과 1로만 이루어진 행렬 A와 행렬 B가 있다. 이때, 행렬 A를 행렬 B로 바꾸는데 필요한 연산의 횟수의 최솟값을 구하는 프로그램을 작성하시오.
행렬을 변환하는 연산은 어떤 3×3크기의 부분 행렬에 있는 모든 원소를 뒤집는 것이다. (0 → 1, 1 → 0)
입력
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
출력
첫째 줄에 문제의 정답을 출력한다. 만약 A를 B로 바꿀 수 없다면 -1을 출력한다.
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
A = [ list(map(int, input().strip())) for i in range(N) ]
B = [ list(map(int, input().strip())) for i in range(N) ]
cnt = 0
flag = 0
def transition(i,j):
global cnt
cnt += 1
for a in range(i,i+3,1):
for b in range(j,j+3,1):
if A[a][b]==1:
A[a][b]=0
else:
A[a][b]=1
for a in range(N-2):
for b in range(M-2):
if A[a][b] != B[a][b]:
transition(a,b)
for i in range(N): # 변환 후 일치하는지 확인
for j in range(M):
if A[i][j] != B[i][j]:
flag = 1
break
if flag == 1: # 변환이 불가능 하면 -1 반환
print(-1)
else:
print(cnt)