본문 바로가기

분류 전체보기

(42)
[고정소수점, 부동소수점] 컴퓨터의 실수 표현 컴퓨터가 기본적으로 소수를 왜 부동소수점 방법으로 사용이 되는지 이해하기 위해서 소수를 알아본다. 소수 수학 소수(素數, [소수])는 수학에서 1과 그수 자신 이외의 자연수로는 나눌 수 없는, 1보다 큰 자연수이다. 소수(小數, [소수]) 수학에서 소수점을 찍어 나타낸 실수이다. 소수(小數)는 수학에서 0보다 크고 1보다 작은 수이다. - 위키백과 소수는 수학에서 소수점을 찍어 나타낸 실수이며 0보다 크고 1보다 작은 수, 즉 정수로 표현할 수 없다. 이런 수를 표현하기 위해 소수점을 이용해 표시하며, 소수점을 기준으로 정수부와 소수부를 나눈다. 예를 들어 0.5에서 0은 정수부이고 5는 소수부이다. 그리고 소수는 분수로 표현할 수 있는데 10진수를 사용하여 5/10으로 표현할 수 있으며, 공약수로 나누..
[백준 16202] MST 게임 문제 16202번: MST 게임 16202번: MST 게임 첫 턴에 찾을 수 있는 MST는 총 5개의 간선 {(1, 3), (1, 2), (2, 4), (4, 6), (4, 5)}로 이루어져 있고, 비용은 16이다. 두 번째 턴에는 첫 턴에서 구한 MST에서 간선의 비용이 최소인 (2, 4)를 제거한 후 남아있 www.acmicpc.net 풀이 문제 이름에도 나와 있듯 MST(최소 신장 트리)를 사용하는 문제이다. 문제에서 제시한 MST의 조건은, 스패닝 트리를 구성하는 간선의 개수는 N-1개이다. 그래프의 임의의 두 정점을 골랐을 때, 스패닝 트리에 속하는 간선만 이용해서 두 정점을 연결하는 경로를 구성할 수 있어야 한다. 이다. 주어진 그래프에서 MST 값을 구하는 문제인데, 주의할 점은 턴마다 최소..
서로소 집합 : Disjoint Set(Union-Find) 개념 서로소 집합 자료구조, Disjoint Set, Union-Find 등의 이름으로 불린다. 서로소는 공통으로 포함하는 원소가 없는 두 집합의 관계다. 즉, Disjoint Set은 공통되는 원소를 처리하기 위한 자료구조라 할 수 있다. Disjoint Set은 Union, Find라는 두가지 연산을 가진다. Union : 원소를 하나의 집합으로 합친다. Find : 원소가 속한 집합이 어떤 집합인지 찾는다. 동작과정 조건 원소의 갯수가 1~6이 있고 아래와 같이 원소를 합친다. 처리할 연산 → (1, 2), (2, 3), (3, 4), (5, 6) 구현 원소의 갯수만큼 배열을 만들고 해당 배열은 자기 자신을 가리키는 각각의 집합으로 초기화한다. union 메서드 public void union(in..
[백준 1167] 트리의 지름 문제 1167번: 트리의 지름 1167번: 트리의 지름 트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 www.acmicpc.net 해결 트리가 주어질 때 간선의 길이가 최대로 길어질 때 그 값을 출력하는 문제이다. 접근 최대의 길이를 구하기 위해선 노드의 끝과 끝을 이은 값들 중 가장 큰 값을 출력하면 될 것이다. 시작하는 노드의 값이 끝 지점에 있는 노드임을 알 수 있다면, dfs를 사용해 각 끝노드까지의 길이를 계산해 가장 큰 값을 출력할 수 있다. 위 이미지를 예로 설명해보자면, 노드 1이 가장 끝 지점에 있으므로 dfs로 해당 노드로 d..
[백준 12015] 가장 긴 증가하는 부분 수열 2 문제 12015번: 가장 긴 증가하는 부분 수열 2 12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) www.acmicpc.net 풀이 해설 LIS LIS의 구현 문제로 문제의 이름과 같이 가장 긴 증가하는 부분 수열의 길이를 출력하는 문제이다. DP로 구현한 LIS로도 문제에 대한 결과 값은 출력이 가능하지만, 이 문제의 입력의 크기는 0~1,000,000이다. DP로 LIS를 구현했을 때 시간 복잡도는 O(N^2)이기 때문에 시간초과로 통과할 수 없다. 따라서 이 문제는 이분 탐색을 통해 구현한 LIS를 사용해야 한다. 이분 탐색을 사용..
[백준 14002] 가장 긴 증가하는 부분 수열4 문제 14002번: 가장 긴 증가하는 부분 수열 4 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 풀이 이 문제는 수열이 주어질 때 가장 긴 증가하는 부분수열의 길이와 요소들을 순차적으로 출력하는 문제이다. LIS와 Stack의 개념을 적용해 풀이해보자. LIS(Longest Increasing Subsequence) LIS의 약어를 해석해보면 최장 증가 부분 수열이다. 이것은 문제가 요구하는 수열을 의미하는 용어임을 알 수 있..
[백준 1937] 욕심쟁이 판다 문제 1937번: 욕심쟁이 판다 1937번: 욕심쟁이 판다 n × n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에 www.acmicpc.net 풀이 이 문제는 DFS의 개념으로 풀이는 가능하지만 DFS만 사용한다면 시간초과로 인해 통과하지 못한다. DFS로 풀며 시간복잡도를 더 줄여야 통과가 가능한 문제이다. 그렇다면 어떻게 더 줄여야 할까? 바로 DP를 이용하면 된다. DP를 사용해서 이미 탐색한 부분이 있다면 진행하지 않고 탐색된 부분의 값을 사용하는 것이다. 코드를 예시로 보자. if (dp[x][y] > 0) { return dp[x][y]; } 위 코..
[백준 2616] 소형기관차 문제 https://www.acmicpc.net/problem/2616 2616번: 소형기관차 첫째 줄에 기관차가 끌고 가던 객차의 수가 입력된다. 그 수는 50,000 이하이다. 둘째 줄에는 기관차가 끌고 가던 객차에 타고 있는 손님의 수가 1번 객차부터 차례로 입력된다. 한 객차에 타고 있 www.acmicpc.net 풀이 문제는 크게 dp를 사용해 풀이한다. 하지만 누적합의 개념도 적용된다. 누적합 문제를 풀기 위해선 누적합을 통해 점화식을 작성해야 한다. 누적합이란 Prefix Sum이라 불린다. 말 그대로 해당 구간에 대해 누적된 합을 구하는 알고리즘이다. 배열의 값이 바뀌지 않는다는 조건이 있을 때 적용이 가능하다. 자신의 인덱스 값과 이전 인덱스 값을 더하며 구현한다. 예를들어 [1, 3, ..