목록알고리즘 (266)
Dev.baelanche
문제에는 배열 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
등차수열 공식을 이용했다. 따라서 x는 이다. N, t, l 모두 주어지므로 수열의 처음시작인 X 를 구하여 x, x+1, x+2, ..., x+l-1 를 출력하면 된다. public static int sequenceSum(int n) { n = n*(n+1)/2; return n; } public static int compareSum(int x, int l) { int sum = 0; for(int i=0; i
피보나치수열을 계산하는 함수 f(n) 을 수행했을때 호출되는 f(0), f(1) 의 개수를 정리한 표이다. n f(0) f(1) 2 1 1 3 1 2 4 2 3 5 3 5 6 5 8 7 8 13 8 13 21 n=0, n=1 일때는 규칙성이 없어서 제외했다. 위 표대로 입력이 n 일때 f(n-1), f(n)을 출력해주면 된다. public static final int MAX = 41; public static int dp[] = new int[MAX]; public static int fibonacci(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]; int result..
주어진 n*m의 배열에서 8*8 범위를 한칸씩 움직이면서 모두 검사한다. 1. BWBW... 순으로 진행하는 체스판을 90도 회전시키면 WBWB... 가 되므로 64 - 칠한 개수와 칠한 개수 중 작은 값을 최소값으로 사용한다. public static void main(String[] args){ Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); char[][] chess = new char[m][n]; int min = 64; for(int i=0; i
주어진 수 n이 3의 배수이면 나누기 3, 2의 배수이면 나누기 2, 그 외 일때는 1을 뺀다. 한번 연산을 수행했을때마다 /3, /2, -1 중에서 가장 1이 빨리 될 경우를 찾아서 연산한다. 제한시간이 2초이므로 메모이제이션 기법을 사용하였다. 1. 동적배열을 만들어 나올 수 없는 수로 초기화 한 후, 각 수 마다 최선의 횟수를 배열에 담는다. 2. n 이 1일때는 예외처리한다. 3. n 이 1일때 0 을 리턴하는 것으로 처리하였으므로 나머지 경우엔 연산을 +1 한다. public static ArrayList dp = new ArrayList(); public static int makeOne(int n) { if(n == 1) return 0; if(dp.get(n) != -1) return dp..
문제 숫자야구 문제를 낼 수 있는 수의 범위가 123~987 사이의 865개이다. 865 * 최대 질문 횟수(100) * 각 자리수의 경우의 수(9) 를 해도 그리 크지 않으므로 이 역시 완전탐색으로 풀었다. 1. 123 부터 루프를 돌아 주어진 질문의 세자리 자연수와 비교하여 스트라이크, 볼 수가 일치할 경우만 체크한다. 2. 222, 353 등 같은 숫자가 2번 이상 올 경우는 예외처리 한다. 3. 마찬가지로 숫자 0도 예외처리 한다. public static String[] base; public static String[] s; public static String[] b; public static int cnt = 0; public static void main(String[] args) { S..
문제 자연수 범위가 1000까지 밖에 안되어서 완전탐색으로 풀었다. 1. 세 자연수의 합이 아무리커도 1000을 넘어서는 안되므로 n(n+1)/2 를 했을때 1000보다 넘지 않는 선으로 루프를 돌렸다. public static void main(String[] args){ Scanner sc = new Scanner(System.in); int t = sc.nextInt(); boolean eq = false; while(t-->0){ int x = sc.nextInt(); for(int i=1; i
문제 최대보드의 크기가 50*50 이고 한 줄 점검시 경우의 수가 50*49, 50줄을 점검해도 50*50*49 이다. 완전탐색으로 풀었다. 1. 사탕 자리를 바꿔서 최대 개수를 구한 후에는 사탕 자리를 원래대로 되돌려 놓는다. Java public class p3085 { static int n; static char c[][]; static int max; public static void main(String[] args){ Scanner sc = new Scanner(System.in); n = sc.nextInt(); c = new char[n][n]; for(int i=0;i