κ³„λž€μ†Œλ…„ 2024. 10. 4. 20:44

μ§‘ν•©μ΄λž€?

  • κ°œλ…: μˆœμ„œμ™€ 쀑볡이 μ—†λŠ” μ›μ†Œλ“€μ„ κ°–λŠ” 자료ꡬ쑰
  • μ’…λ₯˜: μœ ν•œ μ§‘ν•©, λ¬΄ν•œ μ§‘ν•© λ“±, μ€‘μš”ν•œ 것은 μƒν˜Έλ°°νƒ€μ  μ§‘ν•©
    • μƒν˜Έλ°°νƒ€μ  μ§‘ν•©: ꡐ집합이 μ—†λŠ” μ§‘ν•© 관계
      • 이λ₯Ό ν™œμš©ν•˜μ—¬ 이미지 λΆ„ν• , μ΅œμ†Œ μ‹ μž₯트리 μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„, ν΄λŸ¬μŠ€ν„°λ§ μž‘μ—… 등이 κ°€λŠ₯ν•˜λ‹€.

μƒν˜Έλ°°νƒ€μ μ΄λ‹€.

 

μ§‘ν•©μ˜ μ—°μ‚°

 

배열을 ν™œμš©ν•œ 트리둜 ν‘œν˜„

  • λŒ€ν‘œ μ›μ†Œ: 집합을 λŒ€ν‘œν•˜λŠ” μ›μ†Œ -> 루트 λ…Έλ“œλ₯Ό μƒκ°ν•˜μž
  • ν•˜λ‚˜μ˜ λ°°μ—΄λ‘œ μƒν˜Έ 배타적 관계λ₯Ό κ°€μ§€λŠ” 집합을 λͺ¨λ‘ ν‘œν˜„ν•œλ‹€. 집합을 트리둜 λ³€κ²½ μ‹œ "λ°°μ—΄μ˜ κ°’=인덱슀의 λΆ€λͺ¨λ…Έλ“œ"
  • ex) set[9] = 3 -> 9의 λΆ€λͺ¨λŠ” 3

 

μœ λ‹ˆμ˜¨-νŒŒμΈλ“œ μ•Œκ³ λ¦¬μ¦˜

  • μ§‘ν•© μ•Œκ³ λ¦¬μ¦˜μ— 주둜 μ“°μ΄λŠ” μ—°μ‚°: ν•©μΉ˜κΈ°&탐색 = Union&Find -> μ°Ύκ³ λ‚˜μ„œ ν•©μΉ˜μž

 

Find μ—°μ‚°

  • νŠΉμ • λ…Έλ“œμ˜ 루트 λ…Έλ“œ 탐색
  • A,B 두 λ…Έλ“œμ˜ 루트 λ…Έλ“œκ°€ κ°™λ‹€? -> 같은 μ§‘ν•©
  1. ν˜„μž¬λ…Έλ“œμ˜ λΆ€λͺ¨λ…Έλ“œ 확인
  2. λΆ€λͺ¨λ…Έλ“œκ°€ λ£¨νŠΈλ…Έλ“œμ΄λ©΄ μ’…λ£Œ
  3. μ°ΎκΈ° 연산이 μ’…λ£Œλ  λ•ŒκΉŒμ§€ 반볡
  • μž¬κ·€ν•¨μˆ˜λ‘œ κ΅¬ν˜„ν•œλ‹€. 
  • ν•˜μ§€λ§Œ μ΅œμ•…μΌ λ•Œ μ‹œκ°„ λ³΅μž‘λ„κ°€ O(N) -> 경둜 μ••μΆ•μœΌλ‘œ ν•΄κ²°

 

Find μ—°μ‚° λΉ„μš©λ¬Έμ œ -> 경둜 μ••μΆ•

  • μ§‘ν•© ν˜•νƒœλ₯Ό μœ μ§€ν•˜λ©° 트리 높이λ₯Ό 쀄인닀.

 

Union μ—°μ‚°

  • 두 집합을 ν•˜λ‚˜λ‘œ ν•©μΉ¨ = 두 μ§‘ν•©μ˜ λ£¨νŠΈλ…Έλ“œλ₯Ό κ°™κ²Œ ν•œλ‹€.
  1. 두 μ§‘ν•©μ—μ„œ μ°ΎκΈ° 연산을 톡해 λ£¨νŠΈλ…Έλ“œλ₯Ό μ°ΎλŠ”λ‹€.
  2. 찾은 두 루트 λ…Έλ“œλ₯Ό λΉ„κ΅ν•œλ‹€
  3. 두 μ§‘ν•©μ˜ λ£¨νŠΈλ…Έλ“œλ₯Ό κ°™κ²Œν•˜μ—¬ ν•©μΉœλ‹€. λ£¨νŠΈλ…Έλ“œλŠ” μ–΄λ–€ λ£¨νŠΈλ…Έλ“œν•΄λ„ 상관없닀.

 

Union μ—°μ‚° λΉ„μš©λ¬Έμ œ -> 랭크

  • ν˜„μž¬ λ…Έλ“œ κΈ°μ€€μœΌλ‘œ κ°€μž₯ κΉŠμ€ λ…Έλ“œκΉŒμ§€μ˜ 경둜 길이
  1. 두 λ…Έλ“œμ˜ λ£¨νŠΈλ…Έλ“œ κ΅¬ν•˜κΈ°
  2. 각 λ£¨νŠΈλ…Έλ“œμ˜ 랭크 비ꡐ
    1. λž­ν¬κ°’μ΄ λ‹€λ₯΄λ©΄ 큰 λ…Έλ“œ κΈ°μ€€ -> λž­ν¬κ°€ 큰 λ£¨νŠΈλ…Έλ“œλ₯Ό λž­ν¬κ°€ μž‘μ€ λ£¨ν† λŠλ“œμ˜ λΆ€λͺ¨λ…Έλ“œλ‘œ λ³€κ²½
    2. λž­ν¬κ°’μ΄ κ°™μœΌλ©΄ μ•„λ¬΄κ±°λ‚˜ 선택

 

μƒν˜Έλ°°νƒ€μ  μ§‘ν•© ν‘œν˜„μœ„ν•΄μ„œ ν•„μš”ν•œ μ—°μ‚°

  • find(parents,x): xκ°€ μ†ν•œ μ§‘ν•©μ˜ λŒ€ν‘œμ›μ†Œ μ°ΎκΈ°
    • x의 λΆ€λͺ¨κ°€ μžκΈ°μžμ‹ μ΄λ©΄, 즉 xκ°€ λ£¨νŠΈλ…Έλ“œμ΄λ©΄ λ£¨νŠΈλ…Έλ“œλŠ” x이고
    • κ·Έλ ‡μ§€ μ•Šλ‹€λ©΄, λΆ€λͺ¨μ˜ λ£¨νŠΈλ…Έλ“œκ°€ λ‚˜μ˜¬ λ•ŒκΉŒμ§€ μž¬κ·€
  •  union(parents,x,y): x,yκ°€ μ†ν•œ 두 집합을 ν•©μΉœλ‹€.
    • xκ°€ μ†ν•œ μ§‘ν•©μ˜ λ£¨νŠΈλ…Έλ“œμ™€ yκ°€ μ†ν•œ λ£¨νŠΈλ…Έλ“œ μ°ΎκΈ°
    • yκ°€ μ†ν•œ 집합을 xκ°€ μ†ν•œ 집합에 ν•©μΉœλ‹€.

 

문제

폰켓λͺ¬

https://school.programmers.co.kr/learn/courses/30/lessons/1845

def solution(nums):
    answer = 0
    k= len(nums)//2
    return min(len(set(nums)),k)

 

μ˜μ–΄ λλ§μž‡κΈ°

https://school.programmers.co.kr/learn/courses/30/lessons/12981

def solution(n, words):
    answer = []
    '''
    νƒˆλ½κΈ°μ€€
    1) κΈ€μžμ˜ λ§¨μ•žκ³Ό λ‹€μŒ κΈ€μžμ˜ 맨뒀λ₯Ό λΉ„κ΅ν•΄μ„œ λ‹€λ₯΄λ©΄ νƒˆλ½
    2) 이전에 λ“±μž₯ν–ˆμœΌλ©΄ νƒˆλ½ -> 집합을 λ§Œλ“€κ³ , λ§ν•˜λŠ” 단어가 집합에 μžˆλŠ”μ§€λ₯Ό κ΅¬λ³„ν•˜λ©΄ 됨
    '''
    lens=len(words)
    acc=words[0][0]
    sets=set()
    for i,word in enumerate(words):
        if word[0]!=acc or word  in sets:
            return [(i%n)+1,(i//n)+1]
        acc=word[-1]
        sets.add(word)

    return [0,0]

 

μ „ν™”λ²ˆν˜Έ λͺ©λ‘

https://school.programmers.co.kr/learn/courses/30/lessons/42577

def solution(phone_book):
    answer = True
    '''
    1. μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬
    2. 접두사 = startswit둜 자기 κΈ°μ€€ λ°”λ‘œ λ’€λ§Œ 비ꡐ
    '''
    phone_book.sort()
    for i in range(len(phone_book)-1):
        if phone_book[i+1].startswith(phone_book[i]):
            return False
    return True