Categories: CodeJamCompetition

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

2025년 10월 12일 일요일 – 서울 생활 176주차

AI AI Agent들이 어느 정도 유용한 건 맞지만, 생각보다 성능이 그렇게 시원찮은지는 모르겠다. 특히나 코드…

2개월 ago

2025년 9월 21일 일요일 – 서울 생활 173주차

중간 점검 시간이 얼마나 빠른지 여름이 훌쩍 지나 3분기는 이제 겨우 한 주가 남아, 올해의…

3개월 ago

2025년 9월 7일 일요일 – 서울 생활 171주차

금주 금주를 시작해보기로 했다. 이미 술을 먹기로 하고 잡은 2개의 회식들은 예외로 하고, 나머지 자리에서는…

3개월 ago

2025년 8월 31일 일요일 – 서울 생활 170주차

티앤미미 예약이 그렇게 힘들다는 티앤미미를 처남네가 운좋게 예약해서 어제 저녁 다녀왔다. 딤섬이 그렇게 맛있다고 하는데,…

3개월 ago

2025년 8월 17일 일요일 – 서울 생활 168주차

아난티 부산 시설과 고객 서비스가 이렇게 극단적으로 다른 방향인 호텔이 있을까 싶다. 시설의 퀄리티는 5성급이라기에…

4개월 ago

2025년 8월 3일 일요일 – 서울 생활 166주차

스트레스 관리 ENTJ 성격 특인지는 몰라도, 나는 계획했던 일에 변수가 생기면 그 순간 큰 스트레스를…

4개월 ago

This website uses cookies.