본문 바로가기

전체 글

백준 - 1717 집합의 표현(Java) https://www.acmicpc.net/problem/1717 1717번: 집합의 표현 첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 www.acmicpc.net 유니온-파인드(Uion-Find) 문제입니다. 0~n까지의 집합이 주어지고, m번 만큼 특정 두 개의 원소가 같은 집합에 속하는지 알아내는 문제입니다. 문제를 해결하기 위해서는 길이가 n인 배열을 사용해야 합니다. 각 배열의 값은 자신의 부모 노드를 가리키게 해야 합니다. 물론 아무런 연결이 없는 초기에는 자기 자신을 가리키게 하면 됩니다. 다음 그림과 같.. 더보기
백준 - 4803 트리(Java) https://www.acmicpc.net/problem/4803 4803번: 트리 입력으로 주어진 그래프에 트리가 없다면 "No trees."를, 한 개라면 "There is one tree."를, T개(T > 1)라면 "A forest of T trees."를 테스트 케이스 번호와 함께 출력한다. www.acmicpc.net 트리 문제입니다. 테스트 케이스마다 그래프가 주어지고, 해당 그래프에 트리가 몇 개인지 출력을 하는 문제입니다. 트리는 부모-자식이 계층 구조를 가지는 비선형 자료구조입니다. 계층 구조를 지니기 때문에, 사이틀이 발생해서는 안됩니다. 위 그림과 같이, 트리는 그래프와 달리 사이클이 생기면 안됩니다. 두 개의 노드를 연결하는 트리의 간선 개수는 몇개 일까요? 네, 1개 입니다. 세.. 더보기
백준 - 1991 트리 순회(Java) https://www.acmicpc.net/problem/1991 1991번: 트리 순회 첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파 www.acmicpc.net 전위, 중위, 후위 탐색문제입니다. 다양한 자료 구조를 사용해서 풀어도 되지만, 저의 경우 Map을 이용해 문제를 풀었습니다. 기본적으로 위 세 개의 탐색은 재귀를 이용하면 됩니다. 단, 정답 출력 부분을 어디에 둘 것인 가에 따라 다른 탐색이 됩니다. 이진 트리로 입력을 받기 때문에, 위 세 가지의 탐색 모두 평균 시간복잡도는 O(logV)가 될 것입니다. 경우에 따라 노드가 한 쪽으.. 더보기
프로그래머스 - 코딩테스트 연습(Java) DP 문제입니다. 문제와 초기 알고력과 코딩력이 주어집니다. 알고력과 코딩력의 증가 방법은 다음 두 가지와 같습니다. 1초마다 알고력 혹은 코딩력을 증가시킬 수 있습니다. 문제를 풀어 알고력과 코딩력을 증가시킬 수 있습니다. DP 문제인 것만 알면, 해결 방법은 간단합니다. 초기 알고력과 코딩력을 1씩 증가 시킴과 동시에, 풀 수 있는 문제를 확인하면 됩니다. 알고력을 N, 코딩력을 M, 문제를 P라고 하면 시간복잡도는 O(NMP)입니다. 최대 범위를 기준으로 시간복잡도를 계산하면 150*150*100 = 2,250,000이므로 시간 내에 풀 수 있습니다. 주의해야 할 점은 증가되는 알고력 및 코딩력이 배열의 범위를 벗어날 수 있기 때문에 범위를 벗어 날 경우 최대치로 갱신해야 합니다. [구현 코드] c.. 더보기
프로그래머스 - 파괴되지 않은 건물(Java) 누적합 문제입니다. 자세한 설명은 https://tech.kakao.com/2022/01/14/2022-kakao-recruitment-round-1/에 있으니 꼭 읽어보시기 바랍니다. 이 문제는 해결 방법만 알면 구현하기 매우 간단한 문제입니다.(물론, 해결 방법을 알아내기 쉽지 않습니다.) 행의 길이를 N, 열의 길이를 M, 스킬의 길이를 K라고 하면 대충 단순한 반복문을 통한 해결 방법의 시간 복잡도는 O(NMK)가 됩니다. 시간 복잡도에 따라 대략 250,000,000,000정도가 걸리니 효율성을 통과하지 못합니다. 단순한 반복문으로도 정확성을 아주 간단하게 통과할 수 있지만, 입력의 범위가 매우 크므로 누적합을 사용해야만 합니다. 문제 해결의 접근 방식은 아주 간단합니다. (x1, y1)에서 부.. 더보기
백준 - 14002 가장 긴 증가하는 부분 수열 4(Java) https://www.acmicpc.net/problem/14002 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 동적 프로그래밍(DP) 및 역추적 문제입니다. 위 문제는 백준 11053문제와 거의 동일합니다.(https://ksb-dev.tistory.com/100에 11053번 문제에 대해 설명해 놨습니다.) 11053번 문제는 부분 배열중 가장 긴 길이의 크기만 출력하면 되지만, 14002번 문제는 길이 및 부분 배열을 이.. 더보기
백준 - 11404 플로이드(Java) https://www.acmicpc.net/problem/11404 11404번: 플로이드 첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 www.acmicpc.net 문제 이름 그대로 플로이드 와샬(Floyd-Warshall)문제입니다. 플로이드 와샬이란, 각각의 정점에서 다른 정점으로 가는 경우의 최소를 구하는 알고리즘입니다. 가능한 모든 정점 2개의 조합에 대한 최단 경로를 구하는 알고리즘이기 때문에, All-Pairs(ASP)에 속합니다. [시작 정점이 주어지는 다익스트라는 Single-Source(SSP)입니다.] 플로이드 와샬을 풀기 위해서는 노드의 .. 더보기
프로그래머스 - 보석 쇼핑(Java) 투포인터 문제입니다. 투포인터는 O(N^2) 시간 복잡도를 가지는 이중 반복문을 단일 반복문으로 줄여주기 때문에 O(N)의 시간 복잡도를 가져 매우 빠른 연산이 가능합니다. 혹시 투포인터가 어떤건지 잘 모르시는 분은 https://ksb-dev.tistory.com/105에 정리 및 예제를 통한 설명이 있으니 꼭 읽어보시기 바랍니다. 이 문제의 경우 두 개의 포인터를 같은 위치에 두고 시작해야 합니다. 두 개의 포인터를 각각 LP(Low Pointer), HP(High Pointer)라 하겠습니다. 그림과 같이 있을 때, 보석의 종류는 {DIA, RUBY, EMERALD, SAPPHIRE} 입니다. 우선 HP를 모든 보석의 종류를 포함할 때 까지 움직여야 합니다. 그러면 위 그림과 같이 HP를 6번 움직.. 더보기