Algorithm 306

★부분집합 구하기(DFS)

자연수 N이 주어지면 1부터 N까지의 원소를 갖는 집합의 부분집합을 모두 출력하는 프로그램을 작성하세요. 입력예제 3 출력예제 1 2 3 1 2 1 3 1 2 3 2 3 해당 숫자를 사용한다 / 사용하지 않는다. 로 2갈래의 트리가 그려지도록 구현해야한다. 숫자의 사용 여부를 체크해주는 배열이 필요하다. 맨처음은 다 사용하는거(1,2,3) 마지막은 다 사용하지 않는것(공집합) 매개변수로는 부분 집합의 종착점 레벨을 판단하고 사용할 숫자를 지정하는 L로 설정한다. public class Main { static int n; static int[] ch; public void DFS(int L) { //종착점(부분 집합) if(L==n+1) { String tmp = ""; for(int i = 1; i 0..

Algorithm/inflearn 2021.09.29

★이진트리순회(DFS)

스택의 구조를 익히는데 좋음! 전위순회 - 부모 -> 왼쪽자식 -> 오른쪽자식 중위순회 - 왼쪽자식 -> 부모 -> 오른쪽자식 후위순회 - 왼쪽자식 -> 오른쪽자식 -> 부모 import java.util.*; class Node { int data; Node lt, rt; public Node(int val) { data=val; lt=rt=null; } } public class Main { Node root; public void DFS(Node root) { if(root==null) return; else { /* 전위 순회*/ //System.out.print(root.data + " "); DFS(root.lt); /* 중위 순회 */ //System.out.print(root.data + ..

Algorithm/inflearn 2021.09.29

#피보나치 재귀(메모이제이션)

피보나치 수열을 출력하시오. 입력은 피보나치 수열의 총 항의 수이다. 만약 7이 입력되면 1 1 2 3 5 8 13을 출력하면 된다. 왼쪽부터 뻗어나가서 차례로 중복인 값들은 뻗어나가지 않는다. 1 2에서 4로간 뒤 6으로 감. 1 1 2 3 5 8 13 을 출력해야한다. 1.fibo 배열없이 만들게 되면 DFS 메서드를 n만큼 10번 호출해야함. 2.fibo 배열을 만들게되면 DFS(10) 하나만 호출해도 fibo배열에 값이 모두 담기므로 한번 호출하고 배열 출력 3.이미 구한 값들을 다시 구하지 않게 하면 시간복잡도가 매우 좋아짐 fibo[n] > 0일 때 해당 값만 리턴 1.변수 이용 public class Main { public static void main(String[] args) { int..

Algorithm/inflearn 2021.09.29

★★마구간 정하기(결정알고리즘)

import java.util.*; public class Main { public int count(int[] arr, int dist) { //말의 마릿수 int cnt = 1; //배치한 위치 int ep = arr[0]; for(int i = 1; i = dist) { cnt++; ep=arr[i]; } } return cnt; } public int solution(int n,int c, int[] arr) { int answer = 0; //mid를 가장 가까운 두 말의 거리로 배치시킨다. //더 좋은 답이 있다면 좁혀나간다. Arrays.sort(arr); int lt = 1; int rt = arr[n-1]; while(lt= ..

Algorithm/inflearn 2021.09.28

★★뮤직비디오(결정알고리즘)

import java.util.*; class Main { static int n,m; public static void main(String[] args) { Scanner kb = new Scanner(System.in); n = kb.nextInt(); m = kb.nextInt(); int[] arr = new int[n]; for(int i = 0; i < n; i++) { arr[i] = kb.nextInt(); } System.out.println(solution(m, arr)); } //DVD의 최소용량크기를 결정해서 이분탐색하기 private static int solution(int m, int[] arr) { int answer = 0; //dvd가 9개일 때 최소 용량 크기는 9가 ..

Algorithm/inflearn 2021.09.27

이분검색

import java.util.*; public class Main { public int solution(int n,int m, int[] arr) { int answer = 0; //이분검색은 무조건 정렬이 되어있어야한다. //(lt+rt) / 2 를 인덱스 값으로 따로 생성해두고 //해당 값이 큰지 작은지 보고 해당 인덱스 범위로만 탐색하면 된다. //검색 범위가 절반씩 줄어든다. //값이 없을 때도 있을 수 있으니 lt가 rt보다 커지면 멈춰야한다. Arrays.sort(arr); int lt = 0, rt = n-1; while(lt m) rt = mid - 1; //작은 쪽을 날리고 큰 쪽만 탐색 else lt = mid + 1; } return answer; } public static vo..

Algorithm/inflearn 2021.09.27

좌표 정렬

import java.util.*; //Point 객체를 정렬하는 인터페이스를 상속받은 클래스 class Point implements Comparable { public int x, y; Point(int x, int y){ this.x = x; this.y = y; } @Override public int compareTo(Point o) { //음수 값이 나오면 오름차순 정렬 if(this.x==o.x) return this.y-o.y; else return this.x-o.x; } } public class Main { public static void main(String[] args){ Main T = new Main(); Scanner kb = new Scanner(System.in); in..

Algorithm/inflearn 2021.09.27

중복 확인

이중 for문으로 할 수 있지만 효율적으로 정렬 이용하여 풀기 import java.util.Arrays; import java.util.Scanner; public class Main { public String solution(int n, int[] arr) { String answer = "U"; //다른 숫자 //오름차순 정렬★ Arrays.sort(arr); //오름차순 정렬 후 같은 값 비교 for(int i = 0; i < n-1; i++) { if(arr[i]==arr[i+1]) return "D"; } return answer; } public static void main(String[] args){ Main T = new Main(); Scanner kb = new Scanner(Sy..

Algorithm/inflearn 2021.09.27

★★LRU(캐시, 카카오 변형)

import java.util.*; public class Main { public static int[] solution(int size, int k, int[] arr) { int[] answer = new int[size]; //작업 번호를 탐색 for(int i = 0; i < arr.length; i++) { //miss임을 판단 하는 인덱스 번호 int pos = -1; //hit 났을 때 해당 인덱스 값을 구하기 for(int j = 0; j < size; j++) { if (arr[i] == answer[j]) pos = j; } //miss이면 마지막 작업 부터 1번 인덱스까지 값들을 뒤로 보내기 //문제에서 마지막 값인 7을 없애고 그 이전에 있는 6을 넣어야함. //0번 인덱스는 현재..

Algorithm/inflearn 2021.09.27