알고리즘/BOJ

백준 17244번 아맞다우산

꾸준함. 2020. 5. 28. 23:28

문제 링크입니다: https://www.acmicpc.net/problem/17244

 

17244번: 아맞다우산

경재씨는 저녁 약속을 가기 전 챙기지 않은 물건들이 있는 지 확인하고 있다. 필요한 물건은 전부 챙긴 것 같았고 외출 후 돌아오는 길에 경재씨는 외쳤다. "아 맞다 우산!!!" 경재 씨는 매번 외출

www.acmicpc.net

비트마스킹을 통해 아이템을 주웠는지 판별해야하는 흥미로운 BFS 문제였습니다.

물건 'X' 마다 각각 고유 인덱스를 부여하여 비트 연산을 통해 주웠는지를 판별하는 것이 핵심이였습니다.

물건은 최대 5개이기 때문에 인덱스는 최대 4이고 0 ~ 4 까지 모두 표시하기 위해서는 크기가 2^5 즉, 32인 배열이 필요합니다.

물건을 줍는 과정에서 같은 칸을 밟을 수 있기 때문에 평소처럼 이차원 visited 배열을 사용하면 안되고 어떤 물건을 주웠는가까지 표시하는 삼차원 visited 배열을 사용해야했습니다.

따라서, visited 배열을 visited[MAX][MAX][1 << MAX_STUFF] 로 표시했습니다.

 

BFS 탐색을 진행할 때는 다음 칸에 줍지 않은 물건 여부를 확인한 뒤

1. 줍지 않은 물건이 있다면 checked 변수에 비트 연산을 통해 주웠다고 표시하고 큐에 넣습니다.

2. 줍지 않은 물건이 없고 갈 수 있는 칸이라면 그대로 큐에 넣습니다.

3. 모든 물건을 주웠고 도착점에 도착한다면 time을 출력하고 프로그램을 종료합니다.

 

문제 조건에 모든 물건을 챙길 수 없는 경우는 주어지지 않는다. 라고 나와있기 때문에 해당 부분에 대해서는 예외처리를 하지 않았습니다.

 

개발환경:Visual Studio 2017

 

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 18808번 스티커 붙이기  (0) 2020.06.02
백준 17219번 비밀번호 찾기  (0) 2020.05.31
백준 17837번 새로운 게임 2  (0) 2020.05.27
백준 17822번 원판 돌리기  (0) 2020.05.26
백준 16639번 괄호 추가하기 3  (2) 2020.05.26