์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ธŒ๋ฃจํŠธํฌ์Šค

[๋ฐฑ์ค€ 1062 ๐Ÿฅ‡] ๊ฐ€๋ฅด์นจ

1eehyunji 2023. 9. 28. 23:26

https://www.acmicpc.net/problem/1062

 

1062๋ฒˆ: ๊ฐ€๋ฅด์นจ

์ฒซ์งธ ์ค„์— ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜ N๊ณผ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. N์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , K๋Š” 26๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜ ๋˜๋Š” 0์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๋‚จ๊ทน ์–ธ์–ด์˜ ๋‹จ์–ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹จ์–ด๋Š” ์˜์–ด ์†Œ๋ฌธ

www.acmicpc.net

๋ฌธ์ œ

๋‚จ๊ทน์— ์‚ฌ๋Š” ๊น€์ง€๋ฏผ ์„ ์ƒ๋‹˜์€ ํ•™์ƒ๋“ค์ด ๋˜๋„๋ก์ด๋ฉด ๋งŽ์€ ๋‹จ์–ด๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ตฌ์˜จ๋‚œํ™”๋กœ ์ธํ•ด ์–ผ์Œ์ด ๋…น์•„์„œ ๊ณง ํ•™๊ต๊ฐ€ ๋ฌด๋„ˆ์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๊น€์ง€๋ฏผ์€ K๊ฐœ์˜ ๊ธ€์ž๋ฅผ ๊ฐ€๋ฅด์น  ์‹œ๊ฐ„ ๋ฐ–์— ์—†๋‹ค. ๊น€์ง€๋ฏผ์ด ๊ฐ€๋ฅด์น˜๊ณ  ๋‚œ ํ›„์—๋Š”, ํ•™์ƒ๋“ค์€ ๊ทธ K๊ฐœ์˜ ๊ธ€์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋‹จ์–ด๋งŒ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. ๊น€์ง€๋ฏผ์€ ์–ด๋–ค K๊ฐœ์˜ ๊ธ€์ž๋ฅผ ๊ฐ€๋ฅด์ณ์•ผ ํ•™์ƒ๋“ค์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๋Š”์ง€ ๊ณ ๋ฏผ์— ๋น ์กŒ๋‹ค.

๋‚จ๊ทน์–ธ์–ด์˜ ๋ชจ๋“  ๋‹จ์–ด๋Š” "anta"๋กœ ์‹œ์ž‘๋˜๊ณ , "tica"๋กœ ๋๋‚œ๋‹ค. ๋‚จ๊ทน์–ธ์–ด์— ๋‹จ์–ด๋Š” N๊ฐœ ๋ฐ–์— ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ํ•™์ƒ๋“ค์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜ N๊ณผ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. N์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , K๋Š” 26๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜ ๋˜๋Š” 0์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๋‚จ๊ทน ์–ธ์–ด์˜ ๋‹จ์–ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹จ์–ด๋Š” ์˜์–ด ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๊ธธ์ด๊ฐ€ 8๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 15๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค. ๋ชจ๋“  ๋‹จ์–ด๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๊น€์ง€๋ฏผ์ด K๊ฐœ์˜ ๊ธ€์ž๋ฅผ ๊ฐ€๋ฅด์น  ๋•Œ, ํ•™์ƒ๋“ค์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด ๊ฐœ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๋ฌธ์ œํ’€์ด

import sys
from itertools import combinations

n,k=map(int, sys.stdin.readline().strip().split(' '))
# (a,n,t,i,c) 5๊ธ€์ž๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด๋Ÿฐ ๋‹จ์–ด๋„ ๋งํ•  ์ˆ˜ ์—†๋‹ค
if k<5:
    print(0)
    sys.exit(0)

# ์„ ํƒ๋œ ๊ธ€์ž
# ์†Œ๋ฌธ์ž a์˜ ์•„์Šคํ‚ค ์ฝ”๋“œ 97
selected=[0]*26
selected[ord('a')-97]=1
selected[ord('n')-97]=1
selected[ord('t')-97]=1
selected[ord('i')-97]=1
selected[ord('c')-97]=1
k-=5
# ํ•„์š”ํ•œ ๊ธ€์ž
required=set()
# ๋‹จ์–ด๋“ค
words=[]
for _ in range(n):
    word=list(sys.stdin.readline().strip())
    words.append(word)
    # ์•ž ๋’ค ๊ธฐ๋ณธ ๋‹จ์–ด ๋นผ๊ณ  ํƒ์ƒ‰
    for i in range(4, len(word)-4):
        if selected[ord(word[i])-97]==0:
            required.add(word[i])

ans=0
# ๋งŒ์•ฝ k๊ฐ€ ์ „์ฒด ๊ธ€์ž ์ˆ˜๋ณด๋‹ค ํฌ๋‹ค๋ฉด ๋ชจ๋‘ ๊ฐ€๋Šฅ
if k>len(required):
    combinations_char=[]
    combinations_char.append(required)
else:
    combinations_char=list(combinations(required, k))
for combi in combinations_char:
    # ์„ ํƒ๋˜์—ˆ๋‹ค ํ‘œ์‹œ
    for c in combi:
        selected[ord(c)-97]=1
    # ๊ฐ€๋Šฅํ•œ ๋‹จ์–ด์˜ ์ˆ˜ ๊ตฌํ•˜๊ธฐ
    num=0
    for word in words:
        isPossible = True
        for i in range(4, len(word)-4):
            if selected[ord(word[i])-97]==0:
                isPossible=False
                break
        if isPossible:
            num+=1
    ans=max(ans, num)
    # ์„ ํƒ ํ•ด์ œ
    for c in combi:
        selected[ord(c)-97]=0

print(ans)
  • ์‹œ๊ฐ„์ดˆ๊ณผ ๋•Œ๋ฌธ์— ๊ฝค๋‚˜ ์• ๋จน์—ˆ๋˜ ๋ฌธ์ œ๋‹ค..!
  • ๋จผ์ €, ๋ชจ๋“  ๋‹จ์–ด๊ฐ€ anta๋กœ ์‹œ์ž‘ํ•˜๊ณ , tica๋กœ ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์— a,c,i,t,n 5๊ธ€์ž๋Š” ๋ชจ๋‘ ๊ฐ€๋ฅด์ณ์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋ž˜์„œ k๊ฐ€ 5 ๋ฏธ๋งŒ์ด๋ผ๋ฉด ํ•™์ƒ๋“ค์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด๋Š” 0์ด ๋˜๋ฏ€๋กœ, 0์„ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.
  • ๋˜, 5 ์ด์ƒ์ด๋ผ๋ฉด k์—์„œ 5๋ฅผ ๋นผ๊ณ , 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ selected ๋ฐฐ์—ด์— ord() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์œ„ ๋‹ค์„ฏ ๊ธ€์ž์˜ ์•„์Šคํ‚ค์ฝ”๋“œ๋ฅผ ๊ตฌํ•˜๊ณ  97('a'์˜ ์•„์Šคํ‚ค์ฝ”๋“œ)์„ ๋นผ์„œ ๊ฐ ์ธ๋ฑ์Šค์— 1์„ ์ €์žฅํ•œ๋‹ค.
    • selected[ord('a')-97]=1์ด๋ฉด, 'a'๋Š” ํ•™์ƒ๋“ค์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ธ€์ž๋ผ๋Š” ๋œป์ด๋‹ค. 
  • ์ฒ˜์Œ์— ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋Š” ์œ„์ฒ˜๋Ÿผ 0,1๋กœ ํ‘œ์‹œ๋˜๋Š” selected ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , set ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•ด์„œ ํŠน์ • ๊ธ€์ž๊ฐ€ set ์•ˆ์— ์กด์žฌํ•˜๋Š”์ง€ in, not in ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 
    • set ์ž๋ฃŒํ˜•์€ ํƒ์ƒ‰ ์‹œ๊ฐ„์ด O(1)๋กœ ์•Œ๊ณ  ์žˆ์–ด์„œ ๋งˆ์Œ๋†“๊ณ  ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์‚ฌ์‹ค set ์ž๋ฃŒํ˜•๋„ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. set ์ž๋ฃŒํ˜•์€ hash table ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ์ด๋•Œ hash ํ•จ์ˆ˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์—” ์ผ๋ฐ˜ ๋ฆฌ์ŠคํŠธ์™€ ๊ฐ™์ด O(n) ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. 
    • set ์ž๋ฃŒํ˜•์˜ ๋‚ด๋ถ€ hash table์˜ ๊ตฌ์กฐ์™€ ์›๋ฆฌ๋Š” ์ถ”ํ›„ ๋”ฐ๋กœ ํฌ์ŠคํŒ…ํ•  ์˜ˆ์ •์ด๋‹ค!
  • ํ•„์š”ํ•œ ๊ธ€์ž๋ฅผ required set์— ์ €์žฅํ•ด๋‘๊ณ , ์ด set์—์„œ k-5 ๊ฐœ ๊ธ€์ž๋ฅผ ์„ ํƒํ•˜๋Š” ์กฐํ•ฉ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•œ๋‹ค.
    • ์—ฌ๊ธฐ์„œ ์กฐํ•ฉ์„ itertools์˜ combinations๋กœ ๋ฝ‘์•„๋ƒˆ๋Š”๋ฐ, ๋งŒ์•ฝ k๊ฐ€ required set์˜ ๊ฐœ์ˆ˜๋ณด๋‹ค ํฌ๋ฉด ์กฐํ•ฉ์ด ๊ณ„์‚ฐ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋”ฐ๋กœ if๋ฌธ์„ ์ถ”๊ฐ€ํ•ด์„œ ํ•ด๋‹น ๊ฒฝ์šฐ์—” ๋ชจ๋“  required set ๊ธ€์ž๊ฐ€ ํฌํ•จ๋˜๋„๋ก ํ–ˆ๋‹ค. 
  • ํ•ด๋‹น ์กฐํ•ฉ์ด ๊ฐ€์ง€๋Š” ๊ธ€์ž๋ฅผ selected ๊ฐ’ 1๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ , ๋ชจ๋“  ๋‹จ์–ด๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ํ•™์ƒ๋“ค์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • ๊ฐ ์กฐํ•ฉ๋งˆ๋‹ค ํ•™์ƒ๋“ค์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ํŠน์ • ์กฐํ•ฉ์˜ ํƒ์ƒ‰์ด ๋๋‚˜๋ฉด, ๋‹ค์‹œ ํ•ด๋‹น ์กฐํ•ฉ์˜ ๊ธ€์ž๋“ค์˜ selected ๊ฐ’์„ 0์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ , ๋‹ค์Œ ์กฐํ•ฉ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉด์„œ ํƒ์ƒ‰์„ ๋ฐ˜๋ณตํ•œ๋‹ค.