본문 바로가기

반응형

Algorithm

[Algorithm/Java][백준] 1967 트리의 지름 [BOJ] 1967 트리의 지름 https://www.acmicpc.net/problem/1967 문제 접근 dfs를 이용해서 접근하였다. 1번 노드에서 dfs를 시작해서 가장 멀리 있는 노드의 인덱스를 저장했다가, 해당 인덱스부터 다시 dfs를 시작해서 그중에 가장 멀리 있는 노드와의 거리를 구하였다. Code import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class BOJ1967 { static class Node { int end; int value; Node.. 더보기
[Algorithm/Java][백준] 11729 하노이 탑 이동 순서 [BOJ] 11729 하노이탑 이동 순서 https://www.acmicpc.net/problem/11729 문제 접근 일단 하노이 탑을 1에서 2를 거쳐서(이용해서?) 3으로 옮겨야 한다. 나의 직관적인? 접근 방식은 n이 3개일 때, 1.첫 함수 호출로 1 -> 3으로 가장 작은 것을 옮긴다. 2.그리고 다시 함수 호출로 1 -> 2로 두번째로 작은 것을 옮긴다. (이러면 가장 큰것이 1에 있다!) 3.이때는 함수 호출 하지 않고 1 -> 3으로 옮긴다. (이 때 3에 있는 가장 큰 것은 이제 없다고 생각해도 된다!) 4.이제 이 문제는 2개의 원반을 가진 하노이탑을 2 -> 3으로 옮기는 문제로 작아진다. => 함수 호출로 2->3으로 다시 작은 것을 옮긴다. 이 접근을 재귀적으로 잘 정리하면 이렇.. 더보기
[Algorithm/Java][프로그래머스] 소수 찾기 [프로그래머스] 소수 찾기 https://programmers.co.kr/learn/courses/30/lessons/42839 문제 접근 String으로 들어오는 숫자들로 가능한 모든 숫자 조합을 만들고 이 숫자중세서 소수를 찾는 문제이다. 소수를 찾기위해서 Math.sqrt(n)을 이용해서 반복문 횟수를 줄이고, dfs를 이용해서 모든 경우의 수를 탐색하였다. 그리고 같은 숫자가 두개 이상있으면 중복되는 숫자들이 나타나게 되어서 HashSet을 이용해서 중복 경우의 수를 제거하였다. Code import java.util.HashSet; class Solution { char[] nums; boolean[] visited; HashSet hs = new HashSet(); public int solu.. 더보기
[Algorithm/Java][백준] 9020 골드바흐의 추측 [BOJ] 9020 골드바흐의 추측 https://www.acmicpc.net/problem/9020 문제 접근 짝수 n을 가장 차이가 작은 두 소수의 합으로 나타내는 문제이다. 처음에는 n까지 소수를 구하고 그 수중에서 합을 수할려고 했는데, 코드가 너무 복잡해지고 내가 썼는데도 내가 못알아보는 지경이였다... 그리고 결국은 막혔다 그래서 에라토스테네스의 체를 이용해서 10000까지의 소수를 모두 구했다. 그 다음은 가장 차이가 작은 두 소수의 합을 구하기 위해서 num1은 n/2부터 1씩 감소하고 num2는 n- num1으로 해서 num1,num2 모두 소수인 첫번째 경우가 답이였다. 요약하자면 아래와 같다. 1.에라토스네스의 체로 10000까지 소수를 모두 구한다. 2.1의 결과를 바탕으로 n/2부.. 더보기
[Algorithm/Java][프로그래머스] 땅따먹기 [프로그래머스] 땅따먹기 https://programmers.co.kr/learn/courses/30/lessons/12913 문제 접근 처음에 접근할 때 dfs로 풀어야 될까? dp로 풀어야 될까? 고민이 되었는데 dfs로 코드 짜려고 하니까 그냥 바로 막혀서 dp로 생각해봤다. 일단 접근 방식은 현재 내가 밟은 땅과 같은 열을 제외하고 바로 전 행에서 최고점수를 가진 곳을 밟아야 최고 점수를 유지하면서 땅을 밟아갈수 있다. 그래서 dp배열에 그 위치에 해당하는 최고점수를 저장하고, 마지막 행중에서 최고 점수가 최종 답이 된다. Code class Solution { int solution(int[][] land) { int answer = 0; int[][] dp = new int[land.lengt.. 더보기
[Algorithm/Java][백준] 6603 로또 [백준] 6603 로또 https://www.acmicpc.net/problem/6603 문제 접근 백트래킹 방식으로 접근하여 재귀함수를 이용한 DFS를 이용하여 풀었다. 먼저 입력을 받은 숫자를 nums에 저장하고 사용했는지를 저장하기 위해서 nums와 같은 크기의 boolean 배열로 visited를 만들었다. 그리고 최종적으로 6개의 로또 번호를 저장하기 위한 배열 lotto를 만들었다. 결과가 오름차순으로 나와야 해서 lotto[cnt-1]과 nums[i]를 비교해서 탐색을 건너뛰도록 만들었다. Code import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class BOJ.. 더보기
[Algorithm/Java][프로그래머스] 프린터 [프로그래머스] 프린터 https://programmers.co.kr/learn/courses/30/lessons/42587 문제접근 인쇄 대기열에서 우선순위가 높은 것 부터 인쇄를 해야하고, location에 있는 작업이 몇번째로 인쇄되는지를 구해야한다. 그래서 task 클래스를 만들어 우선순위와 처음 주어진 인덱스를 저장하고 이를 큐에 저장을 하고, 가장 큰 우선순위를 표현하기위해서 우선순위 큐를 이용해서 최대 힙을 이용했다. 그래서 해당 location에 있는 작업이 인쇄될 때까지 while문을 돌리도록 했다. Code import java.util.PriorityQueue; import java.util.Queue; import java.util.Collections; import java.uti.. 더보기
[Algorithm/Java][백준] 14502 연구소 [백준] 14502 연구소 https://www.acmicpc.net/problem/14502 문제접근 모든 맵을 돌면서 벽을 3개 세울 수 있는 경우를 모두 탐색해야한다. 재귀함수를 이용해서 벽을 세울 수 있는 지점에서 벽을 세우는 경우와 세우지 않는 경우를 모두 탐색한다. 크게보면 알고리즘은 다음과 같다, 1.벽을 3개 세운다 2.바이러스를 퍼뜨려 본다. 3.안전 영역을 센다. 4.이번 경우가 최대 안전 영역인지 확인한다. 5.1~4를 모든 경우를 탐색한다. Code import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import jav.. 더보기