본문 바로가기

Algorithm

(140)
Programmers - 전력 망을 둘로 나누기 with JAVA (+) 1. 선을 하나씩 끊는다. 2. 연결된 선들로 노드들을 방문처리한다. (인접리스트로 구하되 양방향 연결처리해야 한다.) 3. 최소값을 구한다. import java.util.*; import java.lang.Math; class Solution { public int solution(int n, int[][] wires) { int final_result = (int)1e9; for(int k=0; k
자물쇠와 열쇠 유형 분석 및 구현 이 문제는 복잡하니 천천히 구현해야 한다. 1. 맵 넓히기 2. 자물쇠 설치 3. 키 하나하나 이동하며 설치 - 실패시 : 키 삭제 후 키 로테이션 - 성공시 : 종료 간단하지만 이걸 구현하는데, 맵을 만들고 키를 만들고 크기 구하고 설정할게 많다. 따라서 천천히 구현할 필요가 있다. # 키 로테이션 def rotation(array): x_length = len(array) y_length = len(array[0]) new_array = [[0]*x_length for i in range(y_length)] for i in range(x_length): for j in range(y_length): new_array[j][x_length-i-1] = array[i][j] retur..
인구 이동 문제 유형 파악 및 구현 이 문제 또한 차분하게 풀 필요가 있는 문제이다. BFS를 통해 조건에 맞는 노드들을 그룹짓고 마지막에 변환해주는 간단한 프로그램이지만 고려해야될 부분이 많아 약간 시간을 썼던 것 같다. 이런 문제는 항상 느끼는 거지만 급하지 않게 차분히 하는게 중요하다. 코드 n, min_value, max_value = map(int, input().split()) graph = [] for i in range(n): graph.append(list(map(int,input().split()))) from collections import deque dx = [-1, 0, 1, 0] dy = [0, -1 ,0, 1] real_count = 0 while(1): again_check = Fal..
치킨 배달 유형 파악 및 분석 역시나 구현문제들은 진짜 그냥 차분하게 풀어야한다. 그냥 차분하게 푸니까 풀린다. 이번 문제에 많은 시간을 쏟아 부었다. 구현문제는 항상 설계를 확실히 하는게 중요하고 변수명등 급하게 짜지말자. 코드 n, m = map(int, input().split()) chicken_pos = [] house_pos = [] graph = [] for i in range(n): graph.append(list(map(int, input().split()))) for j in range(n): if graph[i][j] == 1: house_pos.append([i, j]) if graph[i][j] == 2: chicken_pos.append([i, j]) from itertools import..
감시 피하기 유형 파악 및 분석 이 문제는 내 생각엔 구현이 까다로워 구현문제에 가까운 것 같다. 정리를 해보자면 까다로운 구현 + BFS를 통한 감시정도 되는 것 같다. 차분히 구현해야 하며, 구현 과정을 정리하면 아래와 같다. 1. 입력 받음과 동시에, 나중에 맵 초기화를 위한 선생위치, 학생위치, 빈칸위치를 리스트에 담아둔다. 2. 조합을 통해 빈칸위치들 중에서 장애물의 조합을 구한다. 3. 장애물마다 설치하고 감시하고 장애물을 해체하는 과정을 반복한다. 4. 감시 과정은 미리 담아둔 선생위치를 하나씩 꺼내 확인한다. 감시는 학생 발견시 return True를 때려 하던 과정 멈추고 다음 장애물을 확인하기 위해 넘어가게 설정해 두었다. 코드 graph = [] x_pos = [] t_pos = [] s_pos ..
숨바꼭질 문제 유형 분석 및 구현 이 문제도 결과적으로 봐야한다. 결과적으로 한 노드에서 어떠한 노드로 가는데 가장 멀리있는 노드들 중에 번호가 작은 노드를 출력하는 문제이다. 처음에는 헷갈렸던 적도 있는 것 같다. 모든 노드와 노드사이의 최단 경로를 구해야하나라고 생각했다. 하지만 최단경로 문제들은 결과적으로 생각해야 한다. 결과적으로 1번 헛간과 가장 먼 거리를 찾는 경우이므로 다익스트라 알고리즘을 이용한다. 주의할 점은 양방향 통로라는 점이다. 따라서 입력받을 때, 두 노드 모두 경로 처리해야한다. 코드 import heapq n, m = map(int, input().split()) INF = int(1e9) graph = [[] for _ in range(n+1)] for i in range(m): a,..
화성 탐사 유형 파악 및 구현 이 문제는 우선, 한 노드에서 다른 노드로 가는 최단 경로를 구하는 문제이다. 따라서, 다익스트라 알고리즘을 통해 해결한다. 모든 노드에 대해서 첫번째 노드와의 최단경로를 구하면서 마지막 노드까지가서 결과적으로는 첫노드와 마지막노드의 최단경로를 구하는 것이다. 아래의 distance 배열은 노드 [0, 0]과의 거리를 의미한다. 코드 import heapq n = 7 graph = [ [9, 0, 5, 1, 1, 5, 3], [4, 1, 2, 1, 6, 5, 3], [0, 7, 6, 1, 6, 8, 5], [1, 1, 7, 8, 3, 2, 3], [9, 4, 0, 7, 6, 4, 1], [5, 8, 3, 2, 4, 8, 3], [7, 4, 8, 4, 8, 3, 4] ] INF = in..
정확한 순위 유형 파악 및 구현 이 문제는 B의 성적이 A의 성적이 높다 와 같은 정보들이 주어진다. 이를 활용해 성적 순위를 알 수 있는 학생의 수를 출력하는 것이다. 예를 들어, 5는 1보다 성적이 높다 4는 3보다 성적이 높다 2는 4보다 성적이 높다 6는 4보다 성적이 높다 2는 5보다 성적이 높다 5는 4보다 성적이 높다 라는 정보가 주어진다고 가정할 때, 순위를 알 수 있는 학생의 수를 구하는 것이다. 이를 해결하기 위한 전제 조건은 다음과 같다. "A가 B보다 높은지, B가 A보다 높은지 모르겠으면 비교가 불가능한 쌍이 된다" 이는 정확히 순위를 구하는 것이 아닌 순위를 알 수 있는 학생의 수를 구하는 문제이기에 가능하다. 이를 구현할때는 플로이드 워셜 알고리즘을 통해 모든 학생에서 모든 학생으로 가는 ..