목록삼성기출 (15)
코딩 공부

파이어볼의 정보를 담을 리스트 fireballs를 만들고 각각의 파이어볼 정보를 fireballs에 저장하고 파이어볼들을 arr에 위치시킨다. fireballs에 담겨있는 파이어볼의 정보를 pop으로 하나씩 꺼내 다음 좌표를 구한다. 이때 좌표의 양끝, 즉 위와 아래, 오른쪽과 왼쪽이 이어지는 좌표 특성이 있음에 유의한다. 따라서 파이어볼의 위치를 N으로 나눠준다. (모든 fireballs의 다음 좌표를 구하고 나면, fireballs는 빈 리스트 상태가 된다.) 모든 좌표를 돌면서 하나의 파이어볼만 있는 좌표는 fireballs 리스트에 그대로 넣어준다. 2개 이상의 파이어볼이 있는 좌표는 문제에 따라 총질량, 총속력 등을 구해 생성될 파이어볼들의 질량과 속력을 구한다. 이때 총질량//5 == 0 이 ..

공기청정기의 좌표에 의해 위쪽의 순환 및 아래쪽의 순환이 이루어지므로 공기청정기의 좌표를 따로 구해놓는다. T번의 반복이 이루어지므로, 반복문 안에서 확산 및 순환을 구현한다. 미세먼지의 확산은 모든 칸에서 동시에 일어나므로 plus라는 하나의 배열을 임시로 만들어 확산될 먼지들의 합을 구해준 후, 원래의 배열인 arr에 plus값들을 모두 더해준다. 위쪽 순환과 아래쪽 순환을 일으키는데, 위쪽 순환의 경우 시계 방향으로 돌며 배열의 값을 서로 바꿔주고, 아래쪽 순환의 경우 반시계 방향으로 돌며 배열의 값을 서로 바꿔준다. 순환이 끝난 후, 공기청정기의 처음 나가는 칸은 항상 먼지가 없으므로 0의 값으로, 원래 공기청정기의 칸은 -1의 값으로 대입해준다. 모든 칸의 먼지의 양을 더해준다. R, C, T ..

인구이동이 없을 때까지 진행하므로 while True의 무한 반복문 속에서 횟수를 세야겠다. bfs를 통해 연합이 이루어질 수 있는 칸들을 묶고 합산을 칸수로 나눔으로써 인구 수를 재배치시킨다. 이때, 연합의 수가 자기자신뿐이라 1개라면 재배치 및 인구 이동으로 치지 않도록 유의한다. 인구 이동(flag)이 없다면 break문을 통해 반복문에서 빠져나온다. from collections import deque def bfs(x, y, num): global flag q = deque() q.append((x, y)) union = [(x, y)]# 연합할 칸들의 정보 리스트 visited[x][y] = 1 people_sum = num# 연합할 칸들의 인구 수 총합 while q: ci, cj = q.p..

모든 경우를 고려해야하므로 "백트래킹"을 이용하겠다. 또한, dfs에서 n이 진행될수록 카피본을 넘겨줘야하므로 deepcopy를 이용해보겠다. cctv 타입별 가능한 방향 dictionary를 만들어놓아야겠다. cctv의 x, y좌표와 타입을 하나의 튜플로 묶어 정보를 저장해두어야겠다. dfs를 이용해 cctv를 순서대로 돌리면서 그 cctv가 가능한 방향을 순회하면서 감시영역으로 체크하고 다음 cctv로 넘기는 로직을 짜야겠다. 마지막으로 cctv개수만큼 n이 깊어졌다면, answer를 사각지대 최소 개수로 갱신한다. deepcopy를 어느 부분에서 사용해야할지 혼동되어 디버깅할 때 엉뚱하게 중복되어 감시되기도 했다. cctv_info의 타입1의 정보를 "1:[0, 1, 2, 3]"과 같이 설정했었는데..

빈 칸인 공간들 중에 3칸을 뽑아서 벽을 만들기 위해 DFS를 이용한다. DFS의 효율을 높이기 위해 지금 선택한 벽의 개수가 3을 넘어가면 가지치기를 실행해준다. 3개의 후보를 뽑았다면, 3개의 후보를 벽 상태인 1로 만들어주고 BFS를 통해 바이러스를 퍼뜨리고 전체 연구실의 크기(N*M)에서 벽의 수(wall), 임시 벽(3), 바이러스가 퍼진 칸(len(virus)+count)을 빼주면 안전 영역의 크기를 구할 수 있어 이를 return 한다. 위의 과정에서 return 받은 값을 이용해 answer의 값을 안전 영역의 최댓값으로 갱신한다. 임시 벽을 다시 0인 상태로 되돌려준다. from collections import deque def dfs(n, lst): global answer if le..

'ㅜ' 모양을 제외한다면, 일반적인 dfs로 4칸을 차지하는 모양을 만들어 그 칸들의 합을 구한 뒤, answer을 sm의 최댓값으로 갱신한다. 'ㅜ' 모양을 따로 고려하여 answer을 갱신해준다. def dfs(n, ci, cj, sm): global answer if n == 4:# 4칸의 도형이 만들어졌다면 return answer = max(answer, sm) return for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)): ni = ci + di nj = cj + dj if 0