Tit for Tat #717 Div.2

LONGNEW·2021년 6월 21일
0

CP

목록 보기
1/155

https://codeforces.com/contest/1516/problem/A
시간 1초, 메모리 256MB

input :

  • t (1≤t≤20)
  • n k(2≤n≤100 , 1≤k≤10000)
  • a1 , a2, …, an (0≤ai≤100)

output :

  • print the lexicographically smallest array you can obtain

조건 :

  • An array x is lexicographically smaller
  • lexicographically는 사전적 순서라는 의미로 각 배열이 사전순으로 나열이 가능 하도록 만들어라 라는 의미이다.

사전순으로 나타나려면 배열의 원소들을 각각 비교할 때 동일한 idx의 원소가 차이가 나야 하는 것이고 정답인 리스트의 경우에는 원래 리스트보다 더 작은 값이 앞에 존재 해야 한다.

예시로 3 1 4 가 들어 오면 2 1 5 가 이 입력 값보다 사전순으로 앞에 존재하는 것이다.

k번 만큼 반복을 수행 해야 하고 배열의 길이 n 보다 커질 수 없다.
idx에 존재하는 값을 k와 비교해 k가 더 크다면 data[idx] 값을 0으로 만들고 k를 업데이트 하고 그렇지 않은 경우에는 data[idx] 에서 k를 빼고 k를 0으로 업데이트 한다.

while문 조건에 유의 하도록 하자.
정답 코드들의 경우 그냥 n - 1 번째 원소를 계속 더하는데.. 조건에 100보다 작거나 같다라는 조건이 있어 이 경우도 예외처리가 필요하지 않을 까 하다.

import sys
 
t = int(sys.stdin.readline())
for i in range(t):
    n, k = map(int, sys.stdin.readline().split())
    data = list(map(int, sys.stdin.readline().split()))
 
    idx = 0
    while k > 0 and idx < n - 1:
        if data[idx] < k:
            data[n - 1] += data[idx]
            k -= data[idx]
            data[idx] = 0
        else:
            data[idx] -= k
            data[n - 1] += k
            k = 0
 
        idx += 1
 
    for item in data:
        print(item, end=" ")
    print()

0개의 댓글