ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 20166 λ¬Έμžμ—΄ 지μ˜₯에 빠진 ν˜Έμ„ with Python
    PS 2022. 6. 4. 01:36
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 20166 λ¬Έμžμ—΄ 지μ˜₯에 빠진 ν˜Έμ„

    πŸ’‘ 쑰건

    1. 정신을 μ°¨λ €λ³΄λ‹ˆ λ°”λ‹₯μ—λŠ” 격자 λͺ¨μ–‘μ˜ 타일이 κ°€λ“ν•œ μ„Έμƒμ΄μ—ˆκ³ , 각 νƒ€μΌλ§ˆλ‹€ μ•ŒνŒŒλ²³ μ†Œλ¬Έμžκ°€ ν•˜λ‚˜μ”© μ¨μžˆλ‹€λ”λΌ.
      두렀움에 가득해 λ―ΈμΉœλ“―μ΄ μ•žλ§Œ 보고 달렀 끝을 μ°Ύμ•„ ν—€λ§Έμ§€λ§Œ 이 세상은 끝이 μ—†μ—ˆκ³ ,
      달리닀 지쳐 λ°”λ‹₯에 λ“œλŸ¬λˆ„μš°λ‹ˆ ν•˜λŠ˜μ— 이런 문ꡬ가 핏빛 κ΅¬λ¦„μœΌλ‘œ λ– λ‹€λ‹ˆκ³  μžˆμ—ˆλ‹€.
    1. 이 세상은 Nν–‰ Mμ—΄μ˜ 격자둜 μƒκ²ΌμœΌλ©°, 각 칸에 μ•ŒνŒŒλ²³μ΄ 써있고 ν™˜ν˜•μœΌλ‘œ 이어진닀. μ™Όμͺ½ μœ„λ₯Ό (1, 1), 였λ₯Έμͺ½ μ•„λž˜λ₯Ό (N, M)이라고 ν•˜μž.
      λ„ˆλŠ” 아무 κ³³μ—μ„œλ‚˜ μ‹œμž‘ν•΄μ„œ μƒν•˜μ’Œμš°λ‚˜ λŒ€κ°μ„  λ°©ν–₯의 칸으둜 ν•œ μΉΈμ”© 이동할 수 μžˆλ‹€. 이 λ•Œ, 이미 μ§€λ‚˜ μ™”λ˜ 칸듀을 λ‹€μ‹œ λ°©λ¬Έν•˜λŠ” 것은 ν—ˆμš©ν•œλ‹€.
      μ‹œμž‘ν•˜λŠ” 격자의 μ•ŒνŒŒλ²³μ„ μ‹œμž‘μœΌλ‘œ, 이동할 λ•Œλ§ˆλ‹€ 각 칸에 써진 μ•ŒνŒŒλ²³μ„ 이어 λΆ™μ—¬μ„œ λ¬Έμžμ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.
      이 곳의 신인 λ‚΄κ°€ μ’‹μ•„ν•˜λŠ” λ¬Έμžμ—΄μ„ K 개 μ•Œλ €μ€„ ν„°μ΄λ‹ˆ, 각 λ¬Έμžμ—΄ λ§ˆλ‹€ λ„ˆκ°€ λ§Œλ“€ 수 μžˆλŠ” 경우의 수λ₯Ό 잘 λŒ€λ‹΅ν•΄μ•Ό λ„ˆμ˜ μ„Έκ³„λ‘œ λŒμ•„κ°ˆ 것이닀.
      경우의 수λ₯Ό μ…€ λ•Œ, λ°©λ¬Έ μˆœμ„œκ°€ λ‹€λ₯΄λ©΄ λ‹€λ₯Έ κ²½μš°μ΄λ‹€. 즉, (1,1)->(1,2) 둜 κ°€λŠ” 것과 (1,2)->(1,1) 을 κ°€λŠ” 것은 μ„œλ‘œ λ‹€λ₯Έ κ²½μš°μ΄λ‹€.
    1. λ„ˆκ°€ 1ν–‰μ—μ„œ μœ„λ‘œ κ°€λ©΄ N ν–‰μœΌλ‘œ κ°€κ²Œ 되며 λ°˜λŒ€λ„ κ°€λŠ₯ν•˜λ‹€.
      λ„ˆκ°€ 1μ—΄μ—μ„œ μ™Όμͺ½μœΌλ‘œ κ°€λ©΄ M μ—΄λ‘œ κ°€κ²Œ 되며 λ°˜λŒ€λ„ κ°€λŠ₯ν•˜λ‹€.
      λŒ€κ°μ„  λ°©ν–₯에 λŒ€ν•΄μ„œλ„ λ™μΌν•œ κ·œμΉ™μ΄ μ μš©λœλ‹€.
      ν•˜λŠ˜μ— μ•„λž˜μ™€ 같은 그림을 κ΅¬λ¦„μœΌλ‘œ 그렀쀄 ν„°μ΄λ‹ˆ 이해해 돕도둝 ν•˜μ—¬λΌ.
      예λ₯Ό λ“€μ–΄μ„œ, λ„ˆκ°€ (1, 1)μ—μ„œ μœ„λ‘œ κ°€λ©΄ (N, 1)이고, μ™Όμͺ½μœΌλ‘œ κ°€λ©΄ (1, M)이며 μ™Όμͺ½ μœ„ λŒ€κ°μ„  λ°©ν–₯으둜 κ°€λ©΄ (N, M)인 것이닀.

    1. 세상을 μ΄λ£¨λŠ” 격자의 정보와, K 개의 λ¬Έμžμ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, ν˜Έμ„μ΄κ°€ λŒ€λ‹΅ν•΄μ•Ό ν•˜λŠ” 정닡을 κ΅¬ν•˜λŠ” 문제.
      16개 μ΄μƒμ˜ 데이터λ₯Ό λ§žμ•„μ•Ό ACλ₯Ό λ°›λŠ”λ‹€.
    1. 첫번째 쀄에 격자의 크기 N, Mκ³Ό 신이 μ’‹μ•„ν•˜λŠ” λ¬Έμžμ—΄μ˜ 개수 K κ°€ 주어진닀.
      λ‹€μŒμ— N개의 쀄에 κ±Έμ³μ„œ M개의 μ•ŒνŒŒλ²³ μ†Œλ¬Έμžκ°€ 곡백없이 주어진닀. μ—¬κΈ°μ„œμ˜ 첫 번째 쀄은 1ν–‰μ˜ 정보이며, N 번째 쀄은 Nν–‰μ˜ 정보이닀.
      μ΄μ–΄μ„œ K개의 쀄에 κ±Έμ³μ„œ 신이 μ’‹μ•„ν•˜λŠ” λ¬Έμžμ—΄μ΄ 주어진닀. λͺ¨λ‘ μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ‘œ 이루어져 μžˆλ‹€.
    1. 3 ≤ N, M ≤ 10, Nκ³Ό M은 μžμ—°μˆ˜μ΄λ‹€.
      1 ≤ K ≤ 1,000, KλŠ” μžμ—°μˆ˜μ΄λ‹€.
      1 ≤ 신이 μ’‹μ•„ν•˜λŠ” λ¬Έμžμ—΄μ˜ 길이 ≤ 5
      신이 μ’‹μ•„ν•˜λŠ” λ¬Έμžμ—΄μ€ 쀑볡될 μˆ˜λ„ μžˆλ‹€.
    1. DFS, 깊이 μš°μ„  탐색 μœ ν˜•μ˜ 문제

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    from sys import stdin, setrecursionlimit
    
    setrecursionlimit(10 ** 9)
    
    n, m, k = map(int, stdin.readline().split())
    ans, arr, res = {}, [], []
    dx, dy = [1, 0, -1, 0, 1, 1, -1, -1], [0, 1, 0, -1, -1, 1, 1, -1]
    ans_list = []
    
    for i in range(n):
        arr.append(list(stdin.readline().rstrip()))
    
    for _ in range(k):
        data = stdin.readline().rstrip()
        ans[data] = 0
        ans_list.append(data)
    
    
    def solve(x, y, cnt, string):
        if cnt > 5:
            return
    
        if string in ans:
            ans[string] += 1
    
        for i in range(8):
            nx, ny = (x + n + dx[i]) % n, (y + m + dy[i]) % m
            solve(nx, ny, cnt + 1, string + arr[nx][ny])
    
    
    for i in range(n):
        for j in range(m):
            start = ''
            solve(i, j, 1, start + arr[i][j])
    
    for k in ans_list:
        if k in ans:
            print(ans[k])

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제

    3 4 3
    abcb
    bcaa
    abac
    aba
    abc
    cab

    μ‹€ν–‰κ²°κ³Ό

    56
    0

    ⌨️ 문제 풀이

    1. n개의 μž…λ ₯을 λ°›μ•„ arr λ¦¬μŠ€νŠΈμ— μ €μž₯ν•œλ‹€.
    1. k번 λ°˜λ³΅ν•˜λ©΄μ„œ 신이 μ’‹μ•„ν•˜λŠ” λ¬Έμžμ—΄ 을 μž…λ ₯ λ°›μ•„ ans에 ν‚€ κ°’μœΌλ‘œ 두고, 0으둜 μ΄ˆκΈ°ν™” ν•œλ‹€.
      λ˜ν•œ ans_list 에 신이 μ’‹μ•„ν•˜λŠ” λ¬Έμžμ—΄μ„ μ €μž₯ν•œλ‹€.
    1. n * m 크기의 리슀트λ₯Ό μˆœνšŒν•˜λ©΄μ„œ 각 μ’Œν‘œμ— ν•΄λ‹Ήν•˜λŠ” λ¬Έμžλ‘œλΆ€ν„° μ‹œμž‘ν•΄ λ§Œμ•½ λ¬Έμžκ°€ ans 에 μžˆλ‹€λ©΄ + 1을 ν•΄μ€€λ‹€.
    1. 8λ°©ν–₯으둜 λ»—μ–΄λ‚˜κ°€λ©΄μ„œ μž¬κ·€λ₯Ό 톡해 solve() 힘수λ₯Ό λ‹€μ‹œ νƒ€λ©΄μ„œ cnt νŒŒλΌλ―Έν„°κ°€ 5 이상이면 return ν•œλ‹€.
    1. n * m 크기의 리슀트λ₯Ό λͺ¨λ‘ μˆœνšŒν–ˆλ‹€λ©΄, ans_list λ₯Ό μˆœνšŒν•œλ‹€.(k)
    1. k κ°€ ans 에 μžˆλ‹€λ©΄, ans λ”•μ…”λ„ˆλ¦¬μ— k 에 ν•΄λ‹Ήν•˜λŠ” ν‚€ κ°’μ˜ valueλ₯Ό 좜λ ₯ν•˜λ©΄ λœλ‹€.
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.