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์ผ๋ก ๋ฐ๊ฟ์ฃผ๊ณ , ๋ค์ ์กฐํฉ์ผ๋ก ๋์ด๊ฐ๋ฉด์ ํ์์ ๋ฐ๋ณตํ๋ค.
'์๊ณ ๋ฆฌ์ฆ > ๋ธ๋ฃจํธํฌ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 2304 ๐ฅ] ์ฐฝ๊ณ ๋ค๊ฐํ (1) | 2023.09.15 |
---|---|
[๋ฐฑ์ค 19942 ๐ฅ] ๋ค์ด์ดํธ (0) | 2023.09.12 |
[๋ฐฑ์ค 1107 ๐ฅ] ๋ฆฌ๋ชจ์ปจ (0) | 2023.08.21 |