A. Exercising Walk

문제

예시

[input]
6
3 2 2 2
0 0 -2 -2 2 2
3 1 4 1
0 0 -1 -1 1 1
1 1 1 1
1 1 1 1 1 1
0 0 0 1
0 0 0 0 0 1
5 1 1 1
0 0 -100 -100 0 100
1 1 5 1
0 0 -100 -100 100 0

[output]
Yes
No
No
Yes
Yes
Yes

답1 – 이곳을 클릭하면 정답이 보입니다
def answer(l, r, d, u, currentPosition, safeArea) :
    finalX = currentPosition[0] + (r-l)
    finalY = currentPosition[1] + (u-d)
    xMin = safeArea[0][0]
    xMax = safeArea[1][0]
    yMin = safeArea[0][1]
    yMax = safeArea[1][1]

    if (xMin == xMax) and (l != 0 or r != 0) :
        return "NO"
    if (yMin == yMax) and (d != 0 or u != 0) :
        return "NO"
    if (xMin <= finalX and finalX <= xMax) and (yMin <= finalY and finalY <= yMax) :
        return "YES"

    return "NO"

testCount = int(input())
for _ in range(testCount) :
    l, r, d, u = map(int, input().split())
    arr = list(map(int, input().split()))
    currentPosition = [arr[0], arr[1]]
    safeArea = [[arr[2], arr[3]], [arr[4], arr[5]]]
    print(answer(l, r, d, u, currentPosition, safeArea))

핵심은 l, r, d, u 만큼 움직이고 난 후의 최종 위치가 safeArea에 있는지를 판단하는거지만, 이게 문제를 잘 읽어보면 그 길을 걸으면서 safeArea를 벗어나면 안되는거다. 그러니까, safeArea가 한 점인데 (3번 예제) 좌로한번 우로 한번 가버리면 그 한점에서 아웃되는거기 때문에 이거를 고려해줘야한다.

답2 – 이곳을 클릭하면 정답이 보입니다

설명

B. Composite Coloring

문제

예시

[input]
3
3
6 10 15
2
4 9
23
437 519 865 808 909 391 194 291 237 395 323 365 511 497 781 737 871 559 731 697 779 841 961

[output]
1
1 1 1
2
2 1
11
4 7 8 10 7 3 10 7 7 8 3 1 1 5 5 9 2 2 3 3 4 11 6

답1 – 여기를 클릭하면 정답이 보입니다
def prime_list(n):
  sieve = [True] * n
  m = int(n ** 0.5)
  for i in range(2, m + 1):
    if sieve[i] == True:
      for j in range(i+i, n, i):
        sieve[j] = False
  return [i for i in range(2, n) if sieve[i] == True]

def answer(compositeIntegers) :
  n = len(compositeIntegers)
  m = [i for i in range(12, 0, -1)]
  colors = [0] * n
  coloredElCount = 0
  primes = prime_list(999)
  colorId = m.pop()
  primeIndex = 0
  while(coloredElCount != n) :
    divider = primes[primeIndex]
    colorIsUsed = False
    for i in range(n) :
      if colors[i] != 0 :
        continue
      if compositeIntegers[i]%divider == 0 :
        colors[i] = colorId
        coloredElCount += 1
        colorIsUsed = True
    primeIndex = primeIndex + 1
    if colorIsUsed is True :
      colorId = m.pop()
  
  return str(colorId-1) + "\n" + " ".join([str(c) for c in colors])


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

에라토스테네스의 체를 사용해서 풀자!

답2 – 여기를 클릭하면 정답이 보입니다

설명

C. K-Complete Word

문제

예시

[input]
4
6 2
abaaba
6 3
abaaba
36 9
hippopotomonstrosesquippedaliophobia
21 7
wudixiaoxingxingheclp

[output]
2
0
23
16

답1 – 여기를 클릭하면 정답이 보입니다
import collections

def answer(s, k) :
  n = len(s)
  # n이 2일때는 Counter를 쓸 필요가 없으니까~
  if n == 2 :
      if s[0] != s[1] :
        return 1

  minimum = 0
  s = [c for c in s]
  if k == 1 :
    dic = collections.Counter(s)
    _max = dic.most_common()[0][1]
    minimum = (n-_max)
    return minimum
  
  for i in range(n-k) :
    if s[i] == -1 :
      continue
    periodArr = []
    palindromeArr = []
    j = i
    while(n > j) :
      pali = n-j-1
      if s[j] != -1 :
        periodArr.append(s[j])
        s[j] = -1
      
      if j != pali and s[pali] != -1 :
        palindromeArr.append(s[pali])
        s[pali] = -1
      j = j+k
    arr = periodArr + palindromeArr
    dic = collections.Counter(arr)
    _max = dic.most_common()[0][1]
    diff = (len(arr)-_max)
    minimum += diff

  return minimum

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

설명

답2 – 여기를 클릭하면 정답이 보입니다

설명