목록Data Structure & Algorithm (273)
Dev.baelanche
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/KADqI/btqt8mT741a/yd6k7JDODKQWtVg7BMYW8k/img.png)
스택으로 입출력하면 되는 간단한 문제이다. 본 문제에서는 직접 구현한 스택으로 풀었다. import java.util.Scanner; public class Main { Node head; int size = 0; class Node { Node prev; Object value; Node(Object value) { this.value = value; } } public void push(Object value) { Node node = new Node(value); if(size >= 1) node.prev = head; head = node; size++; } public Object pop() { if(size == 0) { return -1; } Node temp = head; head = he..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/OiiZn/btqt247McNM/sNC78szswWfmR5UFxhiL51/img.png)
경우의 수를 구해보면 f(n) = 2(fn-2) + (f-1) 이다. 동적계획법으로 풀면 된다. public static int[] dp; public static int f(int n) { if(n == 0) {dp[0] = 0; return 0;} if(n == 1) {dp[1] = 1; return 1;} if(n == 2) {dp[2] = 3; return 3;} if(n == 3) {dp[3] = 5; return 5;} if(dp[n] != -1) return dp[n]; int result = 2*(f(n-2)%10007) + f(n-1)%10007; dp[n] = result; return result; } public static void main(String[] args) { Scann..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bdA3vQ/btqt1kcGODQ/Ljj292SnKBL1JwUqsywM31/img.png)
n의 증가에 따른 방법의 수를 구해보면 피보나치 수열이다. public static int dp[]; public static int f(int n) { if(n == 0) {dp[0] = 0; return 0;} if(n == 1) {dp[1] = 1; return 1;} if(n == 2) {dp[2] = 2; return 2;} if(dp[n] != -1) return dp[n]; int result = f(n-2)%10007 + f(n-1)%10007; dp[n] = result; return result; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); dp = ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bwqxuN/btqt3Jvg5Xb/mQkajFIrdGTmX7Cfuc7JNk/img.png)
n 의 길이에 따라 만들 수 있는 이진수열의 수를 구해보면 피보나치 수열과 같다. 1. 동적계획법을 이용하여 배열을 채운다. 2. (A+B)%M = (A%M+B%M)%M 을 이용한다. public static int f(int n) { if(n == 0) {dp[0] = 0; return 0;} if(n == 1) {dp[1] = 1; return 1;} if(n == 2) {dp[2] = 2; return 2;} if(dp[n] != -1) return dp[n]; int result = f(n-2)%15746 + f(n-1)%15746; dp[n] = result; return result; } public static void main(String[] args) { Scanner sc = new S..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cjMqRF/btqt1XOL43C/GFacLsQkAbuTfk9sBAGefK/img.png)
n자리 이친수의 개수를 세어보면 피보나치 수열이란 것을 알 수 있다. 1. n의 범위가 90 까지이므로 자료형을 long 으로 선언해야 한다. public static long pinary(int n) { if(n == 0) {dp[0] = 0; return 0;} if(n == 1) {dp[1] = 1; return 1;} if(dp[n] != -1) return dp[n]; long result = pinary(n-2) + pinary(n-1); dp[n] = result; return result; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); dp = new lo..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bfxlZ9/btqt1Ysxoqm/rK9NbCvt6G3ZHSi5mzorqk/img.png)
나누기를 이용한 규칙으로 풀려다가 이 시간에 dp 문제 푸는게 나을 것 같아서 그냥 막 풀었다. public static void main(String[] args) { Scanner sc = new Scanner(System.in); String num = sc.next(); int length = num.length(); int sum = 0; if(length == 2) sum = num.charAt(0) + num.charAt(1) - 96; else if(length == 3) { if(num.charAt(1) == '0') sum = num.charAt(2) - 38; else sum = num.charAt(0) - 38; } else sum = 20; sc.close(); System.out..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cbDFBQ/btqtZNzdRaF/1KkjqXoGGe9tT6tM5D8G9K/img.png)
배열의 각 인덱스 값이 모두 같을때는 값을 그대로 출력하고 하나라도 다를 경우에 "?" 를 출력하면 된다. public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); char arr[][] = new char[n][100]; for(int i=0; i
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dFJ5Fm/btqt2afcdpp/KtRg3FDkuyIkMZFKrdvTMK/img.png)
문제에는 배열 B를 재배열 하지말라고 언급했는데 재배열 하지 않고 풀 줄 모르겠어서 재배열했다... 배열 A, B 를 각각 오름차순, 내림차순으로 정렬하여 곱하면 최소값이 나온다. public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int a[] = new int[n]; int b[] = new int[n]; for(int i=0; i