A. Sequence with Digits

문제

예시

[input]
8
1 4
487 1
487 2
487 3
487 4
487 5
487 6
487 7

[output]
42
487
519
528
544
564
588
628

답1 – 이곳을 클릭하면 정답이 보입니다
from sys import stdin

def answer(start, k):
  a = start
  for i in range(k-1):
    arr = [int(j) for j in str(a)]
    b = a + min(arr) * max(arr)
    if a == b:
      break
    else:
      a = b
  return a

testCount = int(input())
for _ in range(testCount):
  n, k = map(int, stdin.readline().split())
  print(answer(n, k))

최소가 0이 되버리면 계속 같은 숫자니까 루프를 더 돌 필요가 없제~

B. Young Explorers

문제

예시

[input]
2
3
1 1 1
5
2 3 1 2 2

[output]
3
2

답1 – 여기를 클릭하면 정답이 보입니다
def answer(arr):
  arr = sorted(arr)
  count, current, stack = (0, 0, 0)
  for i in range(len(arr)):
    current = arr[i]
    stack += 1
    if current == stack:
      count += 1
      stack = 0
  return count

testCount = int(input())
for _ in range(testCount):
  n = input()
  arr = list(map(int, input().split()))
  print(answer(arr))

이상하게 시간초과가 난다…알아보니까 input()이 문제였다. https://stackoverflow.com/questions/22623528/sys-stdin-readline-and-input-which-one-is-faster-when-reading-lines-of-inpu

그래서 아래와 같이 코드를 고쳤다.

from sys import stdin, stdout 

def answer(arr):
  arr = sorted(arr)
  count, current, stack = (0, 0, 0)
  for i in range(len(arr)):
    current = arr[i]
    stack += 1
    if current == stack:
      count += 1
      stack = 0
  return count

testCount = int(input())
for _ in range(testCount):
  n = stdin.readline()
  arr = list(map(int, stdin.readline().split()))
  print(answer(arr))

앞으로는 stdin만 써야겠다~~

C. Count Triangles

문제

예시

[input]
1 2 3 4

[output]
4


[input]
1 2 2 5

[output]
3


[input]
500000 500000 500000 500000

[output]
1

답1 – 여기를 클릭하면 정답이 보입니다
def sigma(x):
  return (x*(x+1))//2

def answer(A, B, C, D):
  _sum = 0
  for i in range(A, B+1):
    _sum += (i*(i+1))//2
    _length = (C-B+1)
    if i-_length > 0:
      _sum -= sigma(i-_length)
    headMax = D-C+1
    if i > headMax:
      _sum -= sigma(i-headMax)
      if i-headMax > _length:
        _sum += sigma(i-headMax-_length)
  return _sum

A, B, C, D = map(int, input().split())
print(answer(A, B, C, D))
답2 – 여기를 클릭하면 정답이 보입니다
    a, b, c, d = map(int, input().split())
    ans = 0
    for i in range(a + b, b + c + 1):
        counter = min(min(i - a, c) - max(i - b, b) + 1, b - a + 1)
        ans += counter * (max(min(i, d + 1) - c, 0))
    print(ans)

D. Game With Array

문제

예시

[input]
1 4

[output]
YES
4
2


[input]
3 4

[output]
NO


[input]
3 8

[output]
YES
2 1 5
4

답1 – 여기를 클릭하면 정답이 보입니다
def answer(n, s):
  arr = ([1] * (n-1)) + [s-n+1]
  leftSum = sum(arr[:(n-1)])
  last = arr[-1]
  diff = last - leftSum
  if diff > 1:
    print("YES")
    print(" ".join([str(i) for i in arr]))
    print(leftSum+1)
  else:
    print("NO")
    
n, s = map(int, input().split())
answer(n, s)