https://www.acmicpc.net/problem/9328
9328번: 열쇠
상근이는 1층 빌딩에 침입해 매우 중요한 문서를 훔쳐오려고 한다. 상근이가 가지고 있는 평면도에는 문서의 위치가 모두 나타나 있다. 빌딩의 문은 모두 잠겨있기 때문에, 문을 열려면 열쇠가
www.acmicpc.net
문제 이해
빌딩 공간이 주어지고, 해당 공간에는 벽과 문서, 문과 열쇠를 표현하는 문자들이 주어집니다. 최초에 가지고 있는 열쇠가 있으며 길을 가다가 열쇠를 주울 수도 있습니다. 열쇠를 가지고 있으면 해당 하는 열쇠에 맞는 문은 얼마든지 열 수 있습니다. 이러한 정보들이 주어졌을 때 가장 많이 주울 수 있는 문서의 갯수를 구하는 문제였습니다.
입출력 조건
시간초 제한은 1초였으며 빌딩의 크기는 최대 100x100 이었습니다. 테스트 케이스의 갯수는 100개까지였으며 bfs를 돌면 되겠다 생각했습니다.
풀이
1. 첫번째로 풀었던 방법은 가지고 있는 키를 map에 저장해 두고 외곽의 모든 정점에서 bfs를 돌며 bfs를 도는 것이였습니다. 그러다 키를 만나게 되면 해당 키를 보유한 키에 추가하고 다시 그지점에서 bfs를 돌았습니다. 이렇게 되면 구현도 복잡할 뿐더러 시간적으로도 비효율 적이였습니다. 100 * 100 * 100(테케) * 100이상(같은지점 반복횟수)
여기서 첫번째 팁을 얻었습니다.
팁은 키를 map에 유지하는 것이 아니라 키의 최대 갯수는 26개 이므로 visit배열에 키 보유에 관한 정보를 저장하는 것이였습니다.
이를 듣고 2^26의 범위를 확인해 보았고 비트마스킹을 활용하면 되겠구나 생각하였습니다.
2. 키의 정보를 visit 배열에 저장해 두고 bfs를 한번만 돌았습니다. visit배열에 있는 키가 같으면 그냥 넘겨주고 갱신이 된 경우에는 다시금 돌아주게 구현해 주었습니다.
여기서 두번째 팁을 얻었습니다.
저는 구현할 때 모든 외곽 지점을 확인하고 조건을 따져서 들어갈 수 있는 곳에서는 모두 bfs를 돌려주려고 하고 있었습니다. 이때 진짜 생각지도 못한 방법을 알려주었습니다. 외곽을 모두 빈공간으로 채우고, 즉 실제로 존재하는 범위 밖으로 빈공간을 둘러싸 주고 0,0 부터 bfs를 돌리면 되는 것이었습니다!! 이거 들었을 때 진짜 우와ㅏ...했습니다.. 이런방법이!!!
이렇게 하니 진짜 깔끔하게 코드가 작성되었습니다!
에러 및 느낀 점
비트 마스킹을 이용하는 것이 참신하고 재미있었습니다.
구현력이 아직 많이 부족하다는 생각도 들었고 앞으로 많이 풀면서 저도 이렇게 바로바로 생각나도록 하는 연습을 많이 해야겠습니다,,오늘도 많이 배워갑니다
전체 코드
https://github.com/JuneYoungDo/Algorithm/blob/master/9328_%EC%97%B4%EC%87%A0.cpp
GitHub - JuneYoungDo/Algorithm: This is a repository for additional problem solving in Baekjun.
This is a repository for additional problem solving in Baekjun. - GitHub - JuneYoungDo/Algorithm: This is a repository for additional problem solving in Baekjun.
github.com
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ C++] 5021 왕위 계승 (0) | 2022.07.18 |
---|---|
[BOJ C++] 11057 오르막 수 (0) | 2022.07.18 |
[BOJ C++] 14716 현수막 (0) | 2022.07.14 |
[BOJ C++] 4991 로봇 청소기 (0) | 2022.07.14 |
[BOJ C++] 1149 RGB거리 (0) | 2022.07.14 |