λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”₯ PS(Problem Solving) πŸ”₯/BOJ

[BOJ] #5670 νœ΄λŒ€ν° 자판

by dar0m! 2020. 6. 12.
μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ μ •λ‹΅ λΉ„μœ¨
1 초  192 MB 28.013%
 

5670번: νœ΄λŒ€ν° 자판

문제 νœ΄λŒ€ν°μ—μ„œ 길이가 P인 μ˜λ‹¨μ–΄λ₯Ό μž…λ ₯ν•˜λ €λ©΄ λ²„νŠΌμ„ P번 λˆŒλŸ¬μ•Ό ν•œλ‹€. κ·ΈλŸ¬λ‚˜ μ‹œμŠ€ν…œν”„λ‘œκ·Έλž˜λ° 연ꡬ싀에 κ·Όλ¬΄ν•˜λŠ” μŠΉν˜μ—°κ΅¬μ›μ€ 사전을 μ‚¬μš©ν•΄ 이 μž…λ ₯을 더 빨리 ν•  수 μžˆλŠ” 자판 λͺ¨λ“ˆμ„

www.acmicpc.net

 

문제

νœ΄λŒ€ν°μ—μ„œ 길이가 P인 μ˜λ‹¨μ–΄λ₯Ό μž…λ ₯ν•˜λ €λ©΄ λ²„νŠΌμ„ P번 λˆŒλŸ¬μ•Ό ν•œλ‹€. κ·ΈλŸ¬λ‚˜ μ‹œμŠ€ν…œν”„λ‘œκ·Έλž˜λ° 연ꡬ싀에 κ·Όλ¬΄ν•˜λŠ” μŠΉν˜μ—°κ΅¬μ›μ€ 사전을 μ‚¬μš©ν•΄ 이 μž…λ ₯을 더 빨리 ν•  수 μžˆλŠ” 자판 λͺ¨λ“ˆμ„ κ°œλ°œν•˜μ˜€λ‹€. 이 λͺ¨λ“ˆμ€ 사전 λ‚΄μ—μ„œ κ°€λŠ₯ν•œ λ‹€μŒ κΈ€μžκ°€ ν•˜λ‚˜λΏμ΄λΌλ©΄ κ·Έ κΈ€μžλ₯Ό λ²„νŠΌ μž…λ ₯ 없이 μžλ™μœΌλ‘œ μž…λ ₯ν•΄ μ€€λ‹€! μžμ„Έν•œ μž‘λ™ 과정을 μ„€λͺ…ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  1. λͺ¨λ“ˆμ΄ λ‹¨μ–΄μ˜ 첫 번째 κΈ€μžλ₯Ό μΆ”λ‘ ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. 즉, μ‚¬μ „μ˜ λͺ¨λ“  단어가 같은 μ•ŒνŒŒλ²³μœΌλ‘œ μ‹œμž‘ν•˜λ”λΌλ„ λ°˜λ“œμ‹œ 첫 κΈ€μžλŠ” μ‚¬μš©μžκ°€ λ²„νŠΌμ„ 눌러 μž…λ ₯ν•΄μ•Ό ν•œλ‹€.
  2. 길이가 1 이상인 λ¬Έμžμ—΄ c1c2...cn이 μ§€κΈˆκΉŒμ§€ μž…λ ₯λ˜μ—ˆμ„ λ•Œ, 사전 μ•ˆμ˜ λͺ¨λ“  c1c2...cn으둜 μ‹œμž‘ν•˜λŠ” 단어가 c1c2...cncλ‘œλ„ μ‹œμž‘ν•˜λŠ” κΈ€μž cκ°€ μ‘΄μž¬ν•œλ‹€λ©΄ λͺ¨λ“ˆμ€ μ‚¬μš©μžμ˜ λ²„νŠΌ μž…λ ₯ 없이도 μžλ™μœΌλ‘œ cλ₯Ό μž…λ ₯ν•΄ μ€€λ‹€. 그렇지 μ•Šλ‹€λ©΄ μ‚¬μš©μžμ˜ μž…λ ₯을 κΈ°λ‹€λ¦°λ‹€.

예λ₯Ό λ“€λ©΄, 사전에 "hello", "hell", "heaven", "goodbye" 4개의 단어가 있고 μ‚¬μš©μžκ°€ "h"λ₯Ό μž…λ ₯ν•˜λ©΄ λͺ¨λ“ˆμ€ μžλ™μœΌλ‘œ "e"λ₯Ό μž…λ ₯ν•΄ μ€€λ‹€. μ‚¬μ „μƒμ˜ "h"둜 μ‹œμž‘ν•˜λŠ” 단어듀은 λͺ¨λ‘ κ·Έ 뒀에 "e"κ°€ 였기 λ•Œλ¬Έμ΄λ‹€. κ·ΈλŸ¬λ‚˜ 단어듀 쀑 "hel"둜 μ‹œμž‘ν•˜λŠ” 것도, "hea"둜 μ‹œμž‘ν•˜λŠ” 것도 있기 λ•Œλ¬Έμ— μ—¬κΈ°μ„œ λͺ¨λ“ˆμ€ μ‚¬μš©μžμ˜ μž…λ ₯을 κΈ°λ‹€λ¦°λ‹€. μ΄μ–΄μ„œ μ‚¬μš©μžκ°€ "l"을 μž…λ ₯ν•˜λ©΄ λͺ¨λ“ˆμ€ "l"을 μžλ™μœΌλ‘œ μž…λ ₯ν•΄ μ€€λ‹€. κ·ΈλŸ¬λ‚˜ μ—¬κΈ°μ„œ λλ‚˜λŠ” 단어인 "hell"κ³Ό 그렇지 μ•Šμ€ 단어인 "hello"κ°€ κ³΅μ‘΄ν•˜λ―€λ‘œ λͺ¨λ“ˆμ€ λ‹€μ‹œ μž…λ ₯을 κΈ°λ‹€λ¦°λ‹€. μ‚¬μš©μžκ°€ "hell"을 μž…λ ₯ν•˜κΈ° μ›ν•œλ‹€λ©΄ μ—¬κΈ°μ„œ μž…λ ₯을 멈좜 것이고, "hello"λ₯Ό μž…λ ₯ν•˜κΈ° μ›ν•œλ‹€λ©΄ 직접 "o" λ²„νŠΌμ„ λˆŒλŸ¬μ„œ μž…λ ₯ν•΄ μ€˜μ•Ό ν•œλ‹€. λ”°λΌμ„œ "hello"λ₯Ό μž…λ ₯ν•˜λ €λ©΄ μ‚¬μš©μžλŠ” 총 3번 λ²„νŠΌμ„ λˆŒλŸ¬μ•Ό ν•˜κ³ , "hell", "heaven"은 2λ²ˆμ΄λ‹€. "heaven"의 경우 "he"μ—μ„œ "a"λ₯Ό μž…λ ₯ν•˜λ©΄ λ°”λ‘œ 뒷뢀뢄이 λͺ¨λ‘ μžλ™μœΌλ‘œ μž…λ ₯되기 λ•Œλ¬Έμ΄λ‹€. λΉ„μŠ·ν•˜κ²Œ, "goodbye"λŠ” 단 ν•œ 번만 λ²„νŠΌμ„ λˆŒλŸ¬λ„ μž…λ ₯이 μ™„λ£Œλ  것이닀. "g"λ₯Ό μž…λ ₯ν•˜λŠ” μˆœκ°„ 뒀에 μ˜€λŠ” κΈ€μžκ°€ 항상 μœ μΌν•˜λ―€λ‘œ λκΉŒμ§€ μžλ™μœΌλ‘œ μž…λ ₯되기 λ•Œλ¬Έμ΄λ‹€. μ΄λ•Œ 사전에 μžˆλŠ” 단어듀을 μž…λ ₯ν•˜κΈ° μœ„ν•΄ λ²„νŠΌμ„ λˆŒλŸ¬μ•Ό ν•˜λŠ” 횟수의 평균은 (3 + 2 + 2 + 1)/4 = 2.00이닀.

사전이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ©΄μ„œ 이와 같이 각 단어λ₯Ό μž…λ ₯ν•˜κΈ° μœ„ν•΄ λ²„νŠΌμ„ λˆŒλŸ¬μ•Ό ν•˜λŠ” 횟수의 평균을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…μΆœλ ₯

μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€.

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 쀄에 사전에 μ†ν•œ λ‹¨μ–΄μ˜ 개수 N이 주어지며(1 ≤ N ≤ 105), μ΄μ–΄μ„œ N개의 쀄에 1~80κΈ€μžμΈ μ˜μ–΄ μ†Œλ¬Έμžλ‘œλ§Œ 이루어진 단어가 ν•˜λ‚˜μ”© 주어진닀. 이 λ‹¨μ–΄λ“€λ‘œ 사전이 κ΅¬μ„±λ˜μ–΄ 있으며, λ˜‘κ°™μ€ λ‹¨μ–΄λŠ” 두 번 주어지지 μ•ŠλŠ”λ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” λ‹¨μ–΄μ˜ 길이 총합은 μ΅œλŒ€ 106이닀.

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ ν•œ 쀄에 걸쳐 문제의 정닡을 μ†Œμˆ˜μ  λ‘˜μ§Έ μžλ¦¬κΉŒμ§€ λ°˜μ˜¬λ¦Όν•˜μ—¬ 좜λ ₯ν•œλ‹€.

 

ν•΄κ²°

key point, νŠΈλΌμ΄ 자료ꡬ쑰λ₯Ό μ‚¬μš©ν•œλ‹€. cnt 값이 λ‹¬λΌμ§€λŠ” μˆœκ°„μ΄ μ—°μ‚° 횟수!
  1. μž…λ ₯받은 λ¬Έμžμ—΄λ‘œ 트라이λ₯Ό κ΅¬μ„±ν•œλ‹€.
  2. ν•΄λ‹Ή λ…Έλ“œμ— λͺ‡ 번 μž…λ ₯이 λλŠ”μ§€ μ•ŒκΈ° μœ„ν•΄ 맀번 cnt값을 κ°±μ‹ ν•œλ‹€.
  3. μž…λ ₯이 끝났닀면, 트라이λ₯Ό μˆœνšŒν•˜λ©΄μ„œ(dfs) cnt값이 λ‹¬λΌμ§€λŠ” μˆœκ°„λ§ˆλ‹€ ans값을 κ°±μ‹ ν•œλ‹€. → ans += t->cnt
  4. λ¬Έμžμ—΄ 개수 n으둜 ans을 λ‚˜λˆ„κ³  μ†Œμˆ˜μ  λ‘˜μ§Έ μžλ¦¬κΉŒμ§€ λ°˜μ˜¬λ¦Όν•œ 값을 좜λ ₯ν•˜λ©΄ λœλ‹€.

 

순회

ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ 1번

λ£¨νŠΈλŠ” 항상 cntκ°€ 0이고, ν•œ λ²ˆμ΄λΌλ„ μž…λ ₯받은 κΈ€μžμ— λŒ€ν•΄μ„œλŠ” cntκ°€ 1μ΄μƒμ΄λ―€λ‘œ λ¬Έμžμ—΄μ˜ μ‹œμž‘λΆ€λΆ„μ—μ„œλŠ” 항상 cnt만큼이 ans에 μ €μž₯λœλ‹€.

cnt의 의미λ₯Ό 잘 μ‚΄νŽ΄λ³΄λ©΄ cnt값이 μžμ‹μ˜ cntκ°’κ³Ό λ‹¬λΌμ§ˆ λ•Œ μž…λ ₯을 μƒˆλ‘œ λ°›μ•„μ•Ό ν•œλ‹€λŠ” μ˜λ―Έκ°€ 되며, μž…λ ₯을 λ°›μ•„μ•Όλ˜λŠ” νšŸμˆ˜κ°€ λ°”λ‘œ cnt값이 λ˜λŠ” 것이닀.
λ”°λΌμ„œ λΉ¨κ°„μƒ‰μœΌλ‘œ ν‘œμ‹œν•œ 뢀뢄일 λ•Œ ans +=  t->cnt κ°€ 이루어진닀고 λ³Ό 수 μžˆλ‹€.

 

μ½”λ“œ

λ©”λͺ¨λ¦¬ μ‹œκ°„
75388  KB 536  ms

 

λŒ“κΈ€