-
1. 문제
- '.'는 빈 공간을 나타낸다.
- '*'는 벽을 나타내며, 상근이는 벽을 통과할 수 없다.
- '$'는 상근이가 훔쳐야하는 문서이다.
- 알파벳 대문자는 문을 나타낸다.
- 알파벳 소문자는 열쇠를 나타내며, 그 문자의 대문자인 모든 문을 열 수 있다.
- 각 테스트 케이스 마다, 상근이가 훔칠 수 있는 문서의 최대 개수를 출력한다.
12345678910111213141516171819202122232435 17*****************.............**$**B*A*P*C**X*Y*.X.*y*x*a*p**$*$**$******************cz5 11*.**********...*...*x**X*.*.*.*.**$*...*...************07 7*ABCDE*X.....FW.$$$.GV.$$$.HU.$$$.JT.....K*SQPML*ironycs 2. 코드
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970from collections import dequefor T in range(int(input())):N, M = map(int,input().split())maps = [["."] * (M+2) for _ in range(N+2)]for i in range(1,N+1):maps[i] = ["."]+list(input())+["."]key = input()visit = [[-1]*(M+2) for _ in range(N+2)]#알파벳 형태의 키를 비트마스킹으로 숫자로 표현ikey = 0if key != '0':for i in range(len(key)):ikey |= (1<<ord(key[i])-97)cnt = 0row = [1,-1,0,0]col = [0,0,1,-1]q = deque()q.append(([0,0],ikey))while q:cur, k = q.popleft()for d in range(4):nx = cur[0] + row[d]ny = cur[1] + col[d]if nx <0 or ny <0 or nx >N+1 or ny >M+1:continue#같은 키꾸러미를 가지고 같은곳을 방문했을 때if visit[nx][ny] != -1 and visit[nx][ny] == k:continueif maps[nx][ny] == '*':continue#처음 방문할 때if visit[nx][ny] == -1:visit[nx][ny] = 0alpha = ord(maps[nx][ny])#소문자(key)if alpha >= 97 and alpha < 123:q.append(([nx,ny], k|(1<< (ord(maps[nx][ny])-97))))visit[nx][ny] |= k|(1<< (ord(maps[nx][ny])-97))maps[nx][ny] = '.'#대문자(door)elif alpha >= 65 and alpha < 91:#키를 가지고 있을 경우if k & (1 << (ord(maps[nx][ny])-65)) != 0:maps[nx][ny] = '.'q.append(([nx,ny],k))visit[nx][ny] = k#서류elif maps[nx][ny] == '$':cnt += 1maps[nx][ny] = '.'q.append(([nx,ny],k))visit[nx][ny] = k#빈공간elif maps[nx][ny] == '.':q.append(([nx,ny],k))visit[nx][ny] = kprint(cnt)cs 3. 후기
역시 시간초과가 뜬다. 답은 제대로 나오는데 다른 블로그를 봐도 테두리에 '.'으로 채워주고, 문을 따거나, 열쇠를 찾거나, 문서를 발견하면 '.'로 바꿔주는 형식으로 진행했다. 방문 배열에 내가 가지고 있는 키를 비트마스크로 표현하여 저장해서, 키를 찾게되면 방문했던곳도 다시 검사하도록 설정했다. 하지만 두번째 테스트케이스에서 처럼 가지고 있는 키가 0개일 경우 visit[nx][ny] == k에서 k가 0이므로 더 이상 진행이 불가능해서 방문배열을 -1로 채웠다.
'알고리즘 > 백준' 카테고리의 다른 글
8111 0과 1 (0) 2019.03.17 4991 로봇 청소기 (0) 2019.03.15 9376 탈옥 (0) 2019.03.14 12851 숨바꼭질 2 -BFS (0) 2019.03.12 2251 물통 (0) 2019.03.12