본문 바로가기

[Algorithms]

(38)
[Theory] Graph 3. 서로소 집합(Disjoint-set) aka, Union-Find 서로소 집합(Disjoint-set), 혹은 상호배타 집합이라고도 하는 이놈은 서로 중복 포함된 원소가 없는 집합들을 말한다. 즉, 교집합이 없다. 또한, 이렇게 분리된 집합을 구분하기 위해, 집단에 속한 하나의 특정 구분자를 정하게 되는데 이를 대표자(representative) 라 한다. 이렇게 서로소 집합을 표현하는 방법에는 연결리스트를 이용하는 방법과, 트리를 이용하는 방법이 있다. - 연결리스트 : 같은 집합의 원소들을 하나의 연결리스트로 관리해서, 대표자가 아닌 집합의 원소도 따라 들어가며 찾을 수 있다. - 트리 : 형태가 트리라고 해서, 실제로 링크를 연결해서 구현한 것은 아니고, 대표자를 나타내는 배열 한줄로 각 집합들의 대표자를 관리하고, 대표자가 같은 두 원소는 같은 집합에 있다고 생..
[Theory] Graph 2. 인접 리스트(Adjacent List) 탐색 이어서 동일한 그래프를 인접 리스트(Adjacent List)로 나타내 보도록 하자. 인접리스트로 나타내기 위해서는 노드를 구현한 클래스가 필요하다. 이 노드 클래스는 자신의 vertex 번호와, 이어지는 노드에 대한 정보를 담고 있어야 한다. - 노드 클래스 구조 static class Node{ int vertex; Node next; public Node(int vertex, Node next) { this.vertex = vertex; this.next = next; } public Node(int vertex) { this.vertex = vertex; } @Override public String toString() { return "Node [vertex=" + vertex + ", next..
BOJ. 11559번. Puyo Puyo 이 문제 덕에 구현실력을 확실히 늘릴수 있게 되었던 것 같다. 대략 2달 전쯤 풀었었는데, 삼성 SW역량테스트를 준비하다가 생각이 나서 다시 훑어본다는 느낌으로 끄적이게 되었다. 1. 빈칸이 아닌, 색상이 있는 칸을 만나면 BFS를 돈다. -> 리스트에 별도로 저장해 둔다. 2. 해당 리스트안의 요소가 4개 이상이면 터트린다 -> 이후 리스트 초기화! 3. 한개개도 못터트리면 그대로 while 문 종료. 아니라면 ans+1하고 계속 진행. www.acmicpc.net/problem/11559 11559번: Puyo Puyo 총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. 이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. R은 빨강, G는 초록,..
[Theory] Graph 1. 인접 행렬(Adjacent Matrix) 탐색 그래프가 주어졌을때, 이를 표현하는 방법은 여러가지가 있다. 정점을 중심으로 구분하는 경우, 대표적으로 인접 행렬과, 인접 리스트 방식이 있고, 간선을 중심으로 표현하는 간선 리스트 방식이 있다. 그 중에서 인접 행렬(Adjacent Matrix)로 표현하는 방법을 간단히 정리한다. 인접 행렬(Adjacent Matrix)에서 인접( Adjacency)의 의미는, "두개의 정점(Vertex)에 간선(Edge)이 존재하면 서로 인접" 하다고 한다. 따라서 인접 행렬(Adjacent Matrix)의 구현은, VxV크기의 2차원 배열을 이용해서 간선의 정보를 저장한다. 예시) 다음과 같은 그래프가 주어졌다고 하자. 이 그래프를 Matrix상에 표현하면 아래와 같다. 간선들 사이에 방향이 없으므로, [From ..
BOJ. 17143번. 낚시왕 이전 방식과는 다르게 풀어보려고 했다가,, 머리가 굳어서인지 된통 당했다. 1. 낚시꾼을 한칸씩 움직인다. 2. 상어들을 움직인다. 3. 한놈씩 잡아낸다. 상어를 움직일 때 좌표변환만 유의하면 특별히 어렵지 않은 문제이다. www.acmicpc.net/problem/17143 17143번: 낚시왕 낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다. www.acmicpc.net import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; im..
BOJ. 19236번. 청소년상어 청소년 상어 문제는 그래도 그렇저럭 풀만했다...... 아닌가.....;;;; 물고기의 움직임 각각의 상태마다 상어가 움직이면서 그 map의 상태를 들고 다녀야 한다. 그 점만 유의해서 풀면 잘...해결할 수 있다...... www.acmicpc.net/problem/19236 19236번: 청소년 상어 첫째 줄부터 4개의 줄에 각 칸의 들어있는 물고기의 정보가 1번 행부터 순서대로 주어진다. 물고기의 정보는 두 정수 ai, bi로 이루어져 있고, ai는 물고기의 번호, bi는 방향을 의미한다. 방향 bi는 www.acmicpc.net package week8; import java.io.BufferedReader; import java.io.IOException; import java.io.InputS..
BOJ. 19237번. 어른상어 이번 문제는 특별한 알고리즘 개념 없이 단순한 구현 문제였는데 두시간이 넘게 걸렸다. 1. 각 상어의 위치와 상태(방향 등) 값을 따로 저장하고, 상어 구분을 위한 배열, 구분된 상어의 냄새를 위한 배열 두가지를 사용한다. 2. 시간의 흐름에 따라 상어를 움직이는데, 우선순위를 유의해서 상어의 옮길 위치를 업데이트 한다. 3. 옮기기 전에 기존의 냄새를 1씩 날리고, 옮긴 위치의 냄새는 처음 냄새 값인 k를 넣는다. 4. 실수에 유의한다. 차분하게 푸는 습관이 필요하다고 느꼈다. 꼭 채워넣고 싶은 점은 다음 두가지였다. 1. 구현문제에서 항상 그렇듯, 시간이 지날때 마다 지우고 빼는 등, 시점에 따른 컨트롤이 아직 미숙하다. 2. 로직은 항상 괜찮게 짜는 듯 한데, 잔실수가 많다. (Expert 프로님께..
BOJ. 16236번. 아기상어 이번엔 아기상어 문제다. 조건에서 '가까운 물고기를 먹는다'는 조건이 꽤나 까다로웠다. 먹을 수 있는 물고기들의 좌표를 모아서 sorting하는 간단한 방법이 있는데, 방향의 우선순위를 정해서 DFS적인 느낌으로 하려다 보니 풀이에 애를 먹었다. 그 외에 구현은 그렇게 어렵지 않다. 1. 먹을 수 있는 물고기를 찾는다. - 상어가 다음 위치로 갈 수 있는 경우라면, 움직일 때마다 거리를 나타내는 배열에 값을 1씩 추가한다. - 만약에 움직인 위치가 0이 아니고, 먹을 수 있는 고기라면, 고기 후보군에 넣어준다. - 만약 마지막 후보군의 위치보다 거리배열의 위치가 크면, 더이상 진행하지 않는다. 2. 고기 후보군을 Sorting한다. 3. 가서 잡아먹고, 거리만큼 시간에 더해준다. -> 상어 위(잡아먹은 ..
BOJ. 20058번. 마법사 상어와 파이어스톰 상어가 점점 그 실체를 드러내고 있다;; 상어 시리즈는 대게 구현과 시뮬레이션을 주제로 다루고 있고, 이번 문제 역시 배열을 구획을 나눠 회전시키는 방법과 간단한 BFS을 이용하는 문제이다. (한마디로 한 문제에 여러 개념을 때려박은 느낌;;;) 구현은 간단하다. 1. 회전하는 함수를 구성하고 2. 얼음을 녹이고 3. 가장 큰 덩어리는 그냥 bfs로 찾는다. 이런문제 너무 싫... www.acmicpc.net/problem/20058 20058번: 마법사 상어와 파이어스톰 마법사 상어는 파이어볼과 토네이도를 조합해 파이어스톰을 시전할 수 있다. 오늘은 파이어스톰을 크기가 2N × 2N인 격자로 나누어진 얼음판에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c www.acmicpc.net packa..
BOJ. 20057번. 마법사 상어와 토네이도 두 단계로 나누어서 생각하면 간단하다. 1. 먼저 토네이도를 그린다. 2. 각각의 토네이도 좌표에서 주어진 조건처리를 한다 시간을 정해놓고 풀다보니 코드가 깔끔하지 못하다. 짧은 시간안에 정돈된 코드를 짜는 연습을 더 해야겠다. www.acmicpc.net/problem/20057 20057번: 마법사 상어와 토네이도 마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을 www.acmicpc.net import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream..