Problem Solving/BOJ & Programmers

[BOJ] 2607번: λΉ„μŠ·ν•œ 단어

geum 2024. 10. 18. 16:51

✏️ 문제

영문 μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ‘œ 이루어진 두 단어가 λ‹€μŒμ˜ 두 가지 쑰건을 λ§Œμ‘±ν•˜λ©΄ 같은 ꡬ성을 κ°–λŠ”λ‹€κ³  λ§ν•œλ‹€.

 

  1. 두 개의 단어가 같은 μ’…λ₯˜μ˜ 문자둜 이루어져 μžˆλ‹€.
  2. 같은 λ¬ΈμžλŠ” 같은 개수 만큼 μžˆλ‹€.

 

예λ₯Ό λ“€μ–΄ "DOG"와 "GOD"은 λ‘˜ λ‹€ 'D', 'G', 'O' μ„Έ μ’…λ₯˜μ˜ 문자둜 이루어져 있으며 μ–‘μͺ½ λͺ¨λ‘ 'D', 'G', 'O' κ°€ ν•˜λ‚˜μ”© μžˆμœΌλ―€λ‘œ 이 λ‘˜μ€ 같은 ꡬ성을 κ°–λŠ”λ‹€. ν•˜μ§€λ§Œ "GOD"κ³Ό "GOOD"의 경우 "GOD"μ—λŠ” 'O'κ°€ ν•˜λ‚˜, "GOOD"μ—λŠ” 'O'κ°€ 두 개 μžˆμœΌλ―€λ‘œ 이 λ‘˜μ€ λ‹€λ₯Έ ꡬ성을 κ°–λŠ”λ‹€.

두 단어가 같은 ꡬ성을 κ°–λŠ” 경우, λ˜λŠ” ν•œ λ‹¨μ–΄μ—μ„œ ν•œ 문자λ₯Ό λ”ν•˜κ±°λ‚˜, λΉΌκ±°λ‚˜, ν•˜λ‚˜μ˜ 문자λ₯Ό λ‹€λ₯Έ 문자둜 λ°”κΎΈμ–΄ λ‚˜λ¨Έμ§€ ν•œ 단어와 같은 ꡬ성을 κ°–κ²Œ λ˜λŠ” κ²½μš°μ— 이듀 두 단어λ₯Ό μ„œλ‘œ λΉ„μŠ·ν•œ 단어라고 ν•œλ‹€.

예λ₯Ό λ“€μ–΄ "DOG"와 "GOD"은 같은 ꡬ성을 κ°€μ§€λ―€λ‘œ 이 λ‘˜μ€ λΉ„μŠ·ν•œ 단어이닀. λ˜ν•œ "GOD"μ—μ„œ 'O'λ₯Ό ν•˜λ‚˜ μΆ”κ°€ν•˜λ©΄ "GOOD" κ³Ό 같은 ꡬ성을 κ°–κ²Œ λ˜λ―€λ‘œ 이 λ‘˜ λ˜ν•œ λΉ„μŠ·ν•œ 단어이닀. ν•˜μ§€λ§Œ "DOG"μ—μ„œ ν•˜λ‚˜μ˜ 문자λ₯Ό λ”ν•˜κ±°λ‚˜, λΉΌκ±°λ‚˜, 바꾸어도 "DOLL"κ³Ό 같은 ꡬ성이 λ˜μ§€λŠ” μ•ŠμœΌλ―€λ‘œ "DOG"κ³Ό "DOLL"은 λΉ„μŠ·ν•œ 단어가 μ•„λ‹ˆλ‹€.

μž…λ ₯으둜 μ—¬λŸ¬ 개의 μ„œλ‘œ λ‹€λ₯Έ 단어가 μ£Όμ–΄μ§ˆ λ•Œ, 첫 번째 단어와 λΉ„μŠ·ν•œ 단어가 λͺ¨λ‘ λͺ‡ κ°œμΈμ§€ μ°Ύμ•„ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

πŸ€– μž…μΆœλ ₯ μ˜ˆμ‹œ

 

πŸ’‘ 풀이

 

μ œμΆœν•  λ•Œλ§ˆλ‹€ μ–΄ μ™œ? μ‹Άμ—ˆλ˜ λ¬Έμ œλ‹€. 쉽지 μ•Šμ•˜μŒ..^^

 

아이디어) replace ν™œμš©

이것저것 μ‹œλ„ν•΄λ΄€λŠ”λ° μ΅œμ’…μ μœΌλ‘œλŠ” replace λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄μ„œ 문제λ₯Ό ν’€μ—ˆλ‹€.

 

일단 λ‚΄κ°€ μƒκ°ν•˜λŠ” 이 문제의 핡심은 'ν•œ λ‹¨μ–΄μ—μ„œ ν•œ 문자λ₯Ό λ”ν•˜κ±°λ‚˜, λΉΌκ±°λ‚˜, ν•˜λ‚˜μ˜ 문자λ₯Ό λ‹€λ₯Έ 문자둜 λ°”κΎΈμ–΄ λ‚˜λ¨Έμ§€ ν•œ 단어와 같은 ꡬ성을 κ°–κ²Œ λ˜λŠ” 경우'λ₯Ό 잘 μ²˜λ¦¬ν•˜λŠ” 것이닀. ꡬ성이 같은 κ²½μš°λŠ” sorted λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄μ„œ λ°”λ‘œ νŒŒμ•…ν•  수 있기 λ•Œλ¬Έ! (λ‹€λ₯Έ 방법이 μžˆμ„ 수 있음)

 

ꡬ성이 같지 μ•Šμ€ 경우λ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν–ˆλŠ”μ§€ μ’€ 더 μžμ„Έν•˜κ²Œ μ μ–΄λ³΄μžλ©΄ μ•„λž˜μ™€ κ°™λ‹€.


  1. λͺ¨λ“  λ‹¨μ–΄μ˜ 길이가 같은 게 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 첫 번째 단어와 ν˜„μž¬ 단어λ₯Ό ν™•μΈν•˜λ©΄μ„œ 길이가 κΈ΄ 단어, 짧은 단어 λ¨Όμ € ꡬ뢄
  2. 짧은 단어에 μžˆλŠ” 문자λ₯Ό ν•˜λ‚˜μ”© ν™•μΈν•˜λ©΄μ„œ ν•΄λ‹Ή λ¬Έμžκ°€ κΈ΄ 단어에도 μžˆμ„ 경우, ν•œ λ²ˆμ— ν•˜λ‚˜μ”©λ§Œ "-" 기호둜 replace함
  3. 짧은 단어에 μžˆλŠ” 문자 확인이 λλ‚¬μœΌλ©΄ "-" 기호λ₯Ό λ‹€μ‹œ 곡백으둜 μΉ˜ν™˜ν•΄μ„œ μ΅œμ’… λ¬Έμžμ—΄ 길이 확인
  4. μ΅œμ’… λ¬Έμžμ—΄μ΄ 2 미만일 경우 answer += 1

μ •λ‹΅ μ½”λ“œλŠ” μœ„μ˜ 흐름을 κ·ΈλŒ€λ‘œ κ΅¬ν˜„ν–ˆλ‹€.

 

μ²˜μŒμ—λŠ” 2번 κ³Όμ •μ—μ„œ 개수λ₯Ό κ³ λ €ν•˜μ§€ μ•Šκ³  ~.replace(char, "-")둜 μ‚¬μš©ν–ˆλŠ”λ° AABB / AAAABBBC의 A처럼 νŠΉμ • μ•ŒνŒŒλ²³μ— λŒ€ν•΄ 짧은 단어에 μžˆλŠ” κ°œμˆ˜λ³΄λ‹€ κΈ΄ 단어에 μžˆλŠ” κ°œμˆ˜κ°€ 더 λ§Žμ€ κ²½μš°μ—λ„ λ‹€ μΉ˜ν™˜μ΄ λΌλ²„λ¦¬λŠ” λ¬Έμ œκ°€ μžˆμ—ˆλ‹€. κ·Έλž˜μ„œ replace에 λ³€ν™˜ 횟수λ₯Ό 지정할 수 μžˆλŠ”μ§€ μ°Ύμ•„λ³Έ ν›„ μ μš©ν•΄μ€¬λ‹€.

 

T = int(input())

words = []

first_word = input()

answer = 0

for _ in range(T-1):
    words.append(input())

for word in words:
    # ꡬ성이 같은 경우
    if sorted(first_word) == sorted(word):
        answer += 1
    else:
        long_word = first_word if len(first_word) >= len(word) else word
        short_word = word if long_word == first_word else first_word
        
        for char in short_word:
            if char in long_word:
                long_word = long_word.replace(char, "-", 1)

        long_word = long_word.replace("-", "")
        
        if len(long_word) < 2:
            answer += 1
        
print(answer)