CodeJam

CodeJam 2019 Round 1A 풀이

◎ 이 포스트는 CodeJam 2019의 Round 1A에 대한 설명과 풀이입니다. 자세한 문제 설명은 공식 사이트를 참조하세요. 아래 풀이는 개인적으로 작성한 것으로 CodeJam 공식 Analysis의 내용과 일치하지 않을 수 있습니다.

A. Pylons

아이디어

B. Golf Gophers

아이디어

중국인의 나머지 정리를 이용해 풀이할 수 있다. 총 7번의 Try가 가능하기 때문에 18 이하의 소수 7개 (2, 3, 5, 7, 11, 13, 17)로 매 Try마다 Blade의 수를 통일하면 각 Try에서 방정식을 얻을 수 있다. 여기서 문제는 2 * 3 * 5 * 7 * 11 * 13 * 17 = 510510으로 10^6보다 작다는 것이다. 이 때 2나 3은 제곱하더라도 다른 소수와 서로소이기 때문에 널찍하게 (5, 7, 9, 11, 13, 16, 17)로 Blade를 통일하면 충분히 범위를 커버할 수 있다.

코드
import sys

def extended(a, b):
  a, b = max(a, b), min(a, b)
  r1, r2 = a, b
  s1, s2 = 1, 0
  t1, t2 = 0, 1

  while r2 > 0:
    q = r1 // r2
    r1, r2 = r2, r1 - q * r2
    s1, s2 = s2, s1 - q * s2
    t1, t2 = t2, t1 - q * t2
  return ((s1 + b) % b, (t1 + a) % a)

Primes = [5, 7, 9, 11, 13, 16, 17]
L = 5 * 7 * 9 * 11 * 13 * 16 * 17
T, N, M = input().split()
T, N, M = int(T), int(N), int(M)
for tt in range(1, T + 1):
  Ret = 0
  for prime in Primes:
    print (" ".join([str(prime)] * 18))
    sys.stdout.flush()

    response = sum([int(x) for x in input().split()]) % prime
    # x = response (mod prime)
    X = (L / prime) % prime
    a, b = extended(prime, X)
    Ret += (L / prime) * b * response

  print (str(int(Ret + L) % L))

C. Alien Rhyme

아이디어

최대 50개의 길이를 가지는 1000개의 단어에 대해서 추출가능한 접미사는 총 50000개다. 이 접미사를 최대로 매칭할 수 있는 경우를 찾으면 된다. 가장 간단한 방법은 일치하는 가장 긴 것부터 매치하는 방법이다. ZABCDE, BABCDE, ZCDE, CCDE의 단어가 있다고 하자. (ZABCDE, ZCDE)와 (BABCDE, CCDE)로 쌍을 지으면 CDE가 공통 접미사가 되기 때문에 한 쌍 밖에 만들 수 없다. (ZABCDE, BABCDE)와 (ZCDE, CCDE)로 쌍을 지으면 ABCDE와 CDE가 공통 접미사가 되기 때문에 두 쌍을 만들 수 있다.

즉, 긴 접미사부터 우선적으로 매칭을 시도하면 짧은 접미사에게 영향을 주지 않기 때문에 최대 매칭을 구할 수 있다.

코드
T = int(input())
for tt in range(1, T + 1):
  N = int(input())
  Words = []
  for i in range(N):
    Words.append(input())
  Suffixs = {}
  Dic = {}
  for i in range(N):
    for j in range(0, len(Words[i])):
      length = len(Words[i]) - j
      if length not in Suffixs:
        Suffixs[length] = []
      if Words[i][j:] not in Dic:
        Dic[Words[i][j:]] = []
      Suffixs[length].append(Words[i][j:])
      Dic[Words[i][j:]].append(i)
  Used = {}
  Ret = 0
  keys = list(Suffixs.keys())
  keys.sort(), keys.reverse()
  for key_ in keys:
    for word in Suffixs[key_]:
      # check suffix is already used
      if word in Used:
        continue
      # Filter out already used words
      for i in range(len(Dic[word]) - 1, -1, -1):
        if Dic[word][i] in Used:
          del Dic[word][i]
      # If pair can't be made, continue
      if len(Dic[word]) < 2:
        continue
      # Mark used index and word.
      Used[Dic[word][0]], Used[Dic[word][1]], Used[word] = True, True, True
      Ret += 2    
  print("Case #" + str(tt) + ": " + str(Ret))
admin

Share
Published by
admin

Recent Posts

2024년 2월 11일 일요일 – Mountain View 생활 122주차

유럽 여행 2주간 대학 친구와 유럽여행을 다녀왔다. 런던 출장외에 유럽 여행은 완전 처음이었는데, 좋았던 점이…

3개월 ago

2024년 1월 14일 일요일 – Mountain View 생활 118주차

Layoff 이번 주에 또 한차례 Layoff가 있었다. 작년 1월 대규모 Layoff 이후 1년만의 일이다. 새벽…

4개월 ago

2024년 1월 7일 일요일 – Mountain View 생활 117주차

2023 회고 큰 성공을 만든 건 없지만, 작년에 달성한 것들을 모아보자면 일단 잘리지 않고 해고를…

4개월 ago

2023년 12월 31일 일요일 – Mountain View 생활 116주차

영주권 매일 아침 USPS 이메일과 USCIS 앱을 열어보면서 기다리던 영주권이 드디어 발급되었다. 오늘 드디어 새로…

4개월 ago

2023년 11월 19일 일요일 – Mountain View 생활 110주차

TL;DR 이 일기는 OKR 설정의 어려움, 효과적인 마케팅 전략의 필요성, 가족 중심의 삶과 이민자로서의 경력…

6개월 ago

2023년 11월 12일 일요일 – Mountain View 생활 109주차

TL;DR 미국 생활에 찾아온 작은 변화와 가족과의 여행 소소한 행복, 그리고 AI 기술의 급속한 발전…

6개월 ago

This website uses cookies.