본문 바로가기

Algorithm

(17)
[Algorithm] Greedy 이번 장에서는 Greedy 알고리즘을 활용하여 문제를 해결해본다. 모든 코드는 깃허브 (링크)의 테스트 코드로 정리해두었다. 씨름선수 현수는 씨름 감독입니다. 현수는 씨름 선수를 선발공고를 냈고, N명의 지원자가 지원을 했습니다. 현수는 각 지원자의 키와 몸무게 정보를 알고 있습니다. 현수는 씨름 선수 선발 원칙을 다음과 같이 정했습니다. “A라는 지원자를 다른 모든 지원자와 일대일 비교해서 키와 몸무게 모두 A지원자 보다 높은 (크고, 무겁다) 지원자가 존재하면 A지원자는 탈락하고, 그렇지 않으면 선발된다.” N명의 지원자가 주어지면 위의 선발원칙으로 최대 몇 명의 선수를 선발할 수 있는지 알아내는 프로그램을 작성하세요. 입력설명 첫째 줄에 지원자의 수 N(5
[Algorithm] Dynamic Programming 이번 장에서는 Dynamic Programming을 활용하여 문제를 해결해본다. 모든 코드는 깃허브 (링크)의 테스트 코드로 정리해두었다. 계단오르기 철수는 계단을 오를 때 한 번에 한 계단 또는 두 계단씩 올라간다. 만약 총 4계단을 오른다면 그 방법의 수는 1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2 로 5가지이다. 그렇다면 총 N계단일 때 철수가 올라갈 수 있는 방법의 수는 몇 가지인가? 입력설명 첫째 줄은 계단의 개수인 자연수 N(3≤N≤35)이 주어집니다. 출력설명 첫 번째 줄에 올라가는 방법의 수를 출력합니다. 입력예제 1 7 출력예제 1 21 풀이 다이나믹 프로그래밍은 크고 복잡한 문제를 소형화시켜서 풀이하는 방법 문제를 확장시키면서 메모이제이션을 하여 단계별로 증가시키는 방..
[Algorithm] BFS 활용 이번 장에서는 BFS 알고리즘을 사용하여 활용 문제를 해결해본다. 모든 코드는 깃허브 (링크)의 테스트 코드로 정리해두었다. 미로의 최단거리 통로 7*7 격자판 미로를 탈출하는 최단경로의 길이를 출력하는 프로그램을 작성하세요. 경로의 길이는 출발점에서 도착점까지 가는데 이동한 횟수를 의미한다. 출발점은 격자의 (1, 1) 좌표이 고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 도로이다. 격자판의 움직임은 상하좌우로만 움직인다. 미로가 다음과 같다면 S 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 E 위와 같은 경로가 최단 경로의 길이는 12이다. 입력설명 첫 번..
[Algorithm] DFS 활용 이번 장에서는 DFS 알고리즘을 사용하여 활용 문제를 해결해본다. 모든 코드는 깃허브 (링크)의 테스트 코드로 정리해두었다. 합이 같은 부분집합(아마존 기출) N개의 원소로 구성된 자연수 집합이 주어지면, 이 집합을 두 개의 부분집합으로 나누었을 때 두 부분집합의 원소의 합이 서로 같은 경우가 존재하면 “YES"를 출력하고, 그렇지 않으면 ”NO"를 출력하는 프로그램을 작성하세요. 둘로 나뉘는 두 부분집합은 서로소 집합이며, 두 부분집합을 합하면 입력으로 주어진 원래의 집합이 되어야 합니다. 예를 들어 {1, 3, 5, 6, 7, 10}이 입력되면 {1, 3, 5, 7} = {6, 10} 으로 두 부분집합의 합이 16으로 같은 경우가 존재하는 것을 알 수 있다. 입력설명 첫 번째 줄에 자연수 N(1
[Algorithm] Graph 이번 장에서는 DFS & BFS 알고리즘을 사용하여 Graph를 탐색해본다. 모든 코드는 깃허브 (링크)의 테스트 코드로 정리해두었다. 그래프와 종류 그래프(Graph)는 Graph (V, E)라고도 표기하며 각각의 노드를 뜻하는 Vertex와 노드를 연결하는 간선을 의미하는 Edge의 집합이다. 무방향 그래프 Vertex를 연결하는 Edge에 방향이 없이 연결되어 있는 그래프. 이러한 그래프의 연결관계를 이차원 배열로 나타내면 아래와 같다. 1과 2는 서로 연결되어 있으므로 1,2와 2,1은 1이다. 2와 4도 서로 연결되어 있으므로 2,4와 4,2는 1이다. 5와 4는 서로 연결되어 있지 않으므로 5,4와 4,5는 0이다. 방향 그래프 Vertex를 연결하는 Edge에 방향이 존재하는 상태로 연결되어..
[Algorithm] DFS 원리 이번 장에서는 DFS 알고리즘을 적용할 때 JVM의 Stack과 Frame이 어떤 식으로 변경되는지 알아본다. Stack과 Frame에 대한 정의는 오라클 공식 문서 (링크)를 확인하거나 필자가 정리한 글 (링크)에서 확인한다. 아래의 그림과 같은 트리를 DFS로 탐색해보도록 한다. 트리를 탐색하는 코드를 작성하면 아래의 이미지와 같이 작성이 된다. 각 노드를 나타내는 Node 클래스는 숫자를 저장할 data 값과 왼쪽 자식 Node, 오른쪽 자식 Node를 가지고 있다. main() 메서드에서는 탐색해야하는 트리를 생성하고 있으며 dfs 메서드에서는 main()에서 생성한 트리를 탐색하고 있다. 우리가 주의깊게 확인해야하는 부분은 dfs메서드다. 한줄한줄 진행될 때 Stack의 변화를 살펴보도록 한다...
[Algorithm] DFS & BFS 기본문제 이번 장에서는 깊이우선탐색(DFS)과 넓이우선탐색(BFS)를 활용하여 문제를 해결해본다. 모든 코드는 깃허브 (링크)의 테스트 코드로 정리해두었다. 이진트리 순회(깊이우선탐색) 아래 그림과 같은 이진트리를 탐색하세요. 전위순회 출력: 1 2 4 5 3 6 7 중위순회 출력: 4 2 5 1 6 3 7 후위순회 출력: 4 5 2 6 7 3 1 public class BinaryTreeSearchDFS { private final List frontSearch = new ArrayList(); private final List midSearch = new ArrayList(); private final List rearSearch = new ArrayList(); static class Node { int d..
[Algorithm] Recursive 이번 장에서는 재귀(Recursive)를 활용하여 문제를 해결해본다. 모든 코드는 깃허브 (링크)의 테스트 코드로 정리해두었다. 재귀함수 자연수 N이 입력되면 재귀함수를 이용하여 1부터 N까지를 출력하는 프로그램을 작성하세요. 입력설명 첫 번째 줄은 정수 N(3