b9328. μ—΄μ‡ 

2025. 5. 21. 15:14Β·Algorithm & Data Structures/BOJ

 

https://www.acmicpc.net/problem/9328

 

 

 

πŸ”‘ μžλ°”λ‘œ ν‘ΈλŠ” μ—΄μ‡  문제 풀이 (λ°±μ€€ 9328)

 


 

πŸ“Œ 문제 κ°œμš”

 

감μ˜₯의 평면도가 μ£Όμ–΄μ‘Œμ„ λ•Œ, μƒν•˜μ’Œμš° 이동을 톡해 κ°€λŠ₯ν•œ λ§Žμ€ λ¬Έμ„œ(’$’)λ₯Ό μ–»λŠ” 것이 λͺ©ν‘œμž…λ‹ˆλ‹€.

 

  • 벽은 *, 빈 곡간은 ., 문은 A~Z, μ—΄μ‡ λŠ” a~z, λ¬Έμ„œλŠ” $
  • μ—΄μ‡ κ°€ μžˆμ–΄μ•Ό 문을 톡과할 수 있음
  • μ—΄μ‡ λŠ” ν•œ 번 νšλ“ν•˜λ©΄ ν•΄λ‹Ή μ’…λ₯˜μ˜ 문을 λͺ¨λ‘ μ—΄ 수 있음
  • 감μ˜₯의 μ™Έκ³½ μ–΄λŠ μ§€μ μ—μ„œλ“  μΉ¨μž… κ°€λŠ₯

 


 

πŸ’‘ 예제 μž…λ ₯

1
5 17
*****************
.............**$*
*B*A*P*C**X*Y*.X.
*y*x*a*p**$*$**$*
*****************
cz

 

예제 좜λ ₯

3

 


 

🧠 μ•Œκ³ λ¦¬μ¦˜ μ ‘κ·Ό 방식

 

이 λ¬Έμ œλŠ” BFS(λ„ˆλΉ„ μš°μ„  탐색) 을 기반으둜 ν’€ 수 있으며, μ—΄μ‡ λ₯Ό νšλ“ν•  λ•Œλ§ˆλ‹€ μƒˆλ‘­κ²Œ μ—΄λ¦¬λŠ” 문듀을 λ‹€μ‹œ 확인해야 ν•˜λ―€λ‘œ 좔가적인 μƒνƒœ 관리가 ν•„μš”ν•©λ‹ˆλ‹€.

 


 

πŸ” 전체 μ½”λ“œ (BFS 기반)

// μ½”λ“œ μ „μ²΄λŠ” μƒλž΅ 없이 μœ„ λ³Έλ¬Έ μ°Έκ³ 
// 핡심 ν•¨μˆ˜: check(), BFS(), main(), logic()

전체 μ½”λ“œλŠ” μœ„ 질문 본문에 ν¬ν•¨λ˜μ–΄ 있으며, 핡심 λ‘œμ§μ€ check() ν•¨μˆ˜μž…λ‹ˆλ‹€.

 


 

🧾 핡심 둜직 μ„€λͺ…

 

 

1. μ‹œμž‘μ  처리: μ™Έκ³½ 탐색

for (int i = 0; i < width; i++) {
    check(0, i, hasKey, 0);
    check(height-1, i, hasKey, 0);
}
for (int i = 0; i < height; i++) {
    check(i, 0, hasKey, 0);
    check(i, width-1, hasKey, 0);
}

→ μ™Έκ³½μ—μ„œ μ§„μž… κ°€λŠ₯ν•œ λͺ¨λ“  점을 check()둜 μ§„μž… μ‹œλ„

 


 

2. μ—΄μ‡ λ₯Ό 먹으면 μ €μž₯된 λ¬Έλ“€ 개방

else if(map[x][y] >= 'a' && map[x][y] <= 'z'){
    hasKey[map[x][y]-'a'] = true;
    ...
    for (Node cur : savedDoor.get(map[x][y])) {
        q.add(cur);
        isVisited[cur.x][cur.y] = true;
    }
}

→ μ—΄μ‡  νšλ“ μ‹œ, savedDoor에 μ €μž₯λ˜μ–΄ 있던 λŒ€μ‘ 문을 λͺ¨λ‘ 큐에 μž¬μΆ”κ°€

 


 

3. 문을 λ§Œλ‚˜λ©΄ μ—΄μ‡  μœ λ¬΄μ— 따라 처리

else if(map[x][y] >= 'A' && map[x][y] <= 'Z'){
    if(hasKey[map[x][y]-'A']) {
        map[x][y] = '.';
        isVisited[x][y] = true;
    } else {
        savedDoor.get(Character.toLowerCase(map[x][y])).add(new Node(x,y));
        return;
    }
}

→ μ—΄μ‡  μ—†μœΌλ©΄ μ €μž₯만 해두고 λ‚˜μ€‘μ— λ‹€μ‹œ λ°©λ¬Έ

 


 

❗️ 직접 κ²ͺ은 μ‹€μˆ˜ 정리

 

 

1. '.' μΉΈμ— isVisited = true λ₯Ό λˆ„λ½

else if(map[x][y] == '.'){
    isVisited[x][y] = true; // βœ… λ°˜λ“œμ‹œ λ°©λ¬Έ 처리 ν•„μš”!
}

→ λ°©λ¬Έ 처리 μ•ˆ ν•΄μ€˜μ„œ 같은 칸을 stack over flow λ°œμƒ

 


 

2. λŒ€λ¬Έμž λ¬Έμ—μ„œ hasKey μž˜λͺ» 쑰회

// ❌ 잘λͺ»λœ 버전
hasKey[map[x][y] - 'a'] // λŒ€λ¬Έμžμ— λŒ€ν•΄ 'a' κΈ°μ€€ μΈλ±μ‹±ν•˜λ©΄ IndexOutOfBounds or null λ°œμƒ

// βœ… μ˜¬λ°”λ₯Έ 버전
hasKey[map[x][y] - 'A']

→ μ—΄μ‡  배열은 a~z κΈ°μ€€ 26μΉΈ. λŒ€λ¬Έμžμ— λŒ€ν•΄μ„  λ°˜λ“œμ‹œ 'A'둜 λ³€ν™˜ν•΄μ•Ό 함

 


 

βœ… 핡심 포인트 정리

포인트 μ„€λͺ…
μ™Έκ³½ μ§„μž… κ°€μž₯자리λ₯Ό 톡해 BFS μ‹œμž‘
μ—΄μ‡  νšλ“ μ‹œ λ¬Έ 개방 HashMap<Character, List>둜 λ¬Έ μ €μž₯
λ°©λ¬Έ 체크 isVisited[][]λŠ” ., λ¬Έμ„œ, λ¬Έ 포함 λͺ¨λ“  유효 칸에 ν•„μˆ˜
μ—΄μ‡  인덱싱 항상 'a', 'A' κΈ°μ€€ 인덱슀 ꡬ뢄 μ² μ €νžˆ

 


 

🎯 κ²°λ‘ : BFS + μƒνƒœ μ €μž₯이 κ³§ μ—΄μ‡ λ‹€

 

이 λ¬Έμ œλŠ” λ‹¨μˆœν•œ 탐색이 μ•„λ‹ˆλΌ, μƒνƒœ λ³€ν™”(μ—΄μ‡  νšλ“)에 따라 이동 κ°€λŠ₯성이 ν™•μž₯λ˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

ν•œ 번 μ—΄μ‡ λ₯Ό μ–»μœΌλ©΄, 과거에 λͺ» κ°”λ˜ 문을 λŒμ•„κ°€μ•Ό ν•œλ‹€λŠ” μ μ—μ„œ μƒνƒœ 기반 BFS 섀계가 μ€‘μš”ν•©λ‹ˆλ‹€.


이미 λ°©λ¬Έν–ˆμ§€λ§Œ μ—΄μ§€λͺ»ν–ˆλ˜ 문의 μœ„μΉ˜λ₯Ό μ•ŒνŒŒλ²³ κΈ°μ€€μœΌλ‘œ map에 μ •λ¦¬ν•˜μ—¬ μ €μž₯해놓고 μ—΄μ‡  발견 μ‹œ 

κ·Έ 문의 μœ„μΉ˜λ₯Ό queue에 λ„£μ–΄μ€ŒμœΌλ‘œμ¨ 탐색을 λŒμ•„κ°ˆ 수 있게 μ„€κ³„ν–ˆλ˜ 방식이 정말 μ‹ μ˜ ν•œμˆ˜ μ˜€λ˜κ²ƒ κ°™μŠ΅λ‹ˆλ‹€.

 

 

 

'Algorithm & Data Structures > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

b2644. μ΄Œμˆ˜κ³„μ‚°  (0) 2025.05.31
b1068. 트리  (0) 2025.05.31
b10942. νŽ λ¦°λ“œλ‘¬?  (0) 2025.05.20
b1655. κ°€μš΄λ°λ₯Ό λ§ν•΄μš”  (0) 2025.05.19
b1774. μš°μ£Όμ‹ κ³Όμ˜ ꡐ감  (0) 2025.05.14
'Algorithm & Data Structures/BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • b2644. μ΄Œμˆ˜κ³„μ‚°
  • b1068. 트리
  • b10942. νŽ λ¦°λ“œλ‘¬?
  • b1655. κ°€μš΄λ°λ₯Ό λ§ν•΄μš”
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (326)
      • Algorithm & Data Structures (246)
        • BOJ (104)
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (27)
        • SQL (21)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • λ„€νŠΈμ›Œν¬ (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    DynamicProgramming
    λ™μ κ³„νšλ²•
    Stack
    λ°±μ€€
    κ³¨λ“œ
    ν›„μœ„μˆœνšŒ
    PriorityQueue
    algorithm
    BFS
    dfs
    λ‹€μ΅μŠ€νŠΈλΌ
    νˆ¬ν¬μΈν„°
    ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
    dp
    baekjoon
    κ΅¬ν˜„
    μ „μœ„μˆœνšŒ
    이뢄탐색
    unionfind
    μŠ€νƒ
    Java
    programmers
    μ•Œκ³ λ¦¬μ¦˜
    Dijkstra
    binarySearch
    SQL
    μœ λ‹ˆμ˜¨νŒŒμΈλ“œ
    κ²½λ‘œμ••μΆ•
    λ°±νŠΈλž˜ν‚Ή
    Union-Find
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Geisha
b9328. μ—΄μ‡ 
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”