11399, 11047, 4296, 1439, 1080(백준)

김태성·2021년 10월 7일

11399 ATM 문제

입력
첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

출력
첫째 줄에 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 출력한다.

  • 입력받은 값들을 리스트에 넣은 후, 정렬해준다
  • 정렬해준 값을 이중 for문을 통해 각 인덱스에 따른 시간의 값을 계산해준다
  • 총 시간의 합을 출력한다
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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

  • 대략적인 로직은 k원에 대하여 큰 동전부터 빼주는 것이다.
  • 큰 동전으로 뺐을 때, 음수이면 뺄 수 없는 것 이므로 다음 작은 동전으로 넘어간다
  • 아니라면 뺄 수 있는 것 이므로 남은 값인 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만보다 작다.

출력
첫째 줄에 다솜이가 해야하는 행동의 최소 횟수를 출력한다.

  • for문을 통해 인덱스를 접근하는데, index-1값과 현재 index의 값이 다르면 cnt를 1씩 높여준다
  • 그게 짝수라면 2로 나눈 값을 출력해주고 홀수라면 2로 나눈값 + 1한 값을 출력해준다.
  • 머리로 이렇게 하면 될 것 같은데? 해서 해봤는데 되서 신기했다
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)
profile
@flip_404

0개의 댓글