본문 바로가기

전체 글

(276)
경쟁적 전염 문제 1부터 K까지 번호가 있는 바이러스가 K 있을 때, N크기의 맵에서 바이러스가 증식한다. 유형 - 일종의 퍼진다 개념이다. - 노드와 간선의 개념이다. - 그래프에서 연결된 노드 집합 구하는 것과 유사하다. 구현 - 입력을 받을때, 바이러스 초기시간(0초), 위치, 값을 처리한다. - 이 후, 값을 작은 순서대로 정렬한다. -> 번호가 작은 순서대로 증식하기 때문에 - 큐에 넣는다. - 선입부터 쭉쭉 꺼낸다. - 만약 꺼낸 데이터의 시간이 기준 시간보다 같다면 멈춘다. - 꺼낸 데이터를 상하좌우 따져서 범위 안인지 확인한다. - 범위 안이면 숫자로 방문처리, 큐에 삽입, (삽입시 현재 시간 + 1 해야한다.) 코드 from collections import deque n, k = map(int, i..
연구소 문제 0 - 빈칸, 1 - 벽, 2 - 바이러스일 때, 바이러스는 상하좌우로 0이 있으면 그 길을 통해 퍼진다. 이 때 벽을 3개 세워 바이러스를 막을 때, 바이러스가 아닌 부분의 최대 개수 (안전영역) 유형 분석 - 그래프와 연결된 모든 노드를 구해서 바이러스가 퍼지는 유형 -> DFS 벽을 세우는 경우의 수 : combinations 바이러스 처리 : DFS or BFS 코드 # 연구소 from itertools import combinations dx = [-1, 0, 1, 0] dy = [0, -1, 0, 1] def virus(x, y, test): for k in range(4): now_x = x + dx[k] now_y = y + dy[k] if now_x = n ..
특정 거리의 도시 찾기 문제 노드의 수(N), 간선의 수 (M), 출발 도시의 번호(X) 가 주어질 때, 노드 X로 부터 거리가 K인 노드 번호를 모두 구하라. 유형 분석 및 해결 - 노드와 간선 그래프이다. - 거리가 모두 1이다. - 특정노드와 거리가 k인 노드 -> BFS 코드 from collections import deque def solution(n, k, x, array): distance = [-1]*(n+1) distance[x] = 0 queue = deque() queue.append(x) while queue: now= queue.popleft() for i in array[now]: if distance[i] == -1: distance[i] = distance[now] + 1 queue.append(..
미로탈출 문제 1 - 가능한 위치, 0 - 괴물일 때, (0, 0)에서 (n, m)까지 이동하는데 가장 짧은 거리 유형 파악 그래프가 주어지고 특정 노드의 위치를 탐색하는 것이므로 우선, BFS/DFS 이다. 코드 dx = [-1, 0, 1, 0] dy = [0, -1, 0, 1] from collections import deque def bfs(array, visited, start): visited[start[0]][start[1]] = True queue = deque() queue.append(start) while queue: x, y = queue.popleft() for i in range(4): next_x = x + dx[i] next_y = y + dy[i] if next_x < 0 or ne..
음료수 얼려먹기 문제 구멍 : 0, 칸막이 : 1 구멍이 뚫려있는 부분끼리 상하좌우로 붙어있는 경우 서로 연결되어 아이스크림 생성 아이스크림의 수는? 유형 파악 우선 아이스크림을 만들려면 연결된 노드들을 파악하다가 더이상 연결된 노드들을 찾을 수 없을 때 아이스크림 하나가 생긴다. 따라서, 연결된 모든 노드들을 탐색할 수 있는 DFS/BFS를 사용할 수 있는데, 둘 다 사용이 가능하다. 코드 def dfs(array, visited, start): x = start[0] y = start[1] visited[x][y] = True dx = [-1, 0, 1, 0] dy = [0, -1, 0, 1] for i in range(4): next_x = x+dx[i] next_y = y+dy[i] if 0
DFS BFS - Concept 해당 문제는 "이것이 코딩 테스트이다" 책을 참고하여 제작하였습니다. 탐색 알고리즘 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정 - DFS, BFS 자료구조 스택 - 후입선출 - list로 구현, append() , pop() - 재귀함수의 수행방식 큐 - 선입선출 - deque로 구현, append(), popleft() - deque는 list보다 데이터 삽입, 삭제가 빠름 오버플로 : 특정한 자료구조가 수용할 수 있는 데이터의 크기를 이미 가득 찬 상태에서 삽입연산을 수행할 때 발생 언더플로 : 데이터가 없는 자료구조에서 삭제 연산을 수행할 때 발생 (+)프로그래밍에서 그래프는 크게 2가지로 표현가능 - 인접 행렬 : 2차원 배열에서 각 노드와 나머지 모든 노드에 대해서 연결된 형태를 기록하..
문제 뱀의 움직임 - 몸길이를 늘려 머리를 다음칸에 위치시킨다. - 이동한 칸에 사과가 있다면 사과는 없어지고 꼬리는 움직이지 않는다. - 사과가 없다면, 몸길이를 줄여 꼬리가 위치한 칸을 비워준다, 즉 몸 길이는 변하지 않는다. 초기 조건 - 초기 길이는 1이다. - 처음에는 오른쪽을 향한다. 게임 끝나는 조건 - 뱀이 자신의 몸 또는 벽에 부딪히는 경우 해결 이 문제는 좀 뱀의 움직임을 이해를 하는데 하는데 노력해야 한다. 1. 뱀의 길이는 1cm이다. 2. 몸길이를 늘려 머리를 다음칸에 위치시킨다. -> 예를 들어, 뱀이 시작지점인 (0, 0)에 위치한다고 가정했을 때, 뱀의 머리와 꼬리 모두 (0, 0)에 위치한 것이다. -> 움직임이 들어가면 (0, 0)에 꼬리, (0, 1)에 머리가 위치한다...
문자열 재정렬 문제 알파벳 대문자와 숫자로만 이루어진 문자열에 대해서 모든 알파벳을 오름차순으로 정렬하고 이 후, 모든 숫자를 더한값을 뒤에 붙여라 "K1KA5CB7" -> ABCKK13 유형 요구하는 것을 그대로 구현하면 되는 문제이다. 따라서 구현문제로 볼 수 있다. 코드 input = "K1KA5CB7" input = "AJKDLSI412K4JSJ9D" str_list = [] num = 0 for i in range(len(input)): if input[i].isalpha(): str_list.append(input[i]) continue num += int(input[i]) str_list.sort() result = [] for i in range(len(str_list)): result.append(st..