목록Data Structure & Algorithm/PS - JAVA (270)
Dev.baelanche
번역 역시나 발번역이다. 구간합을 저장할 배열을 만들어 품종별로 소의 개수를 따로 세어주면 된다. public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int q = Integer.parseInt(st.nextToken()); int a[][] = new int[n][3]; int psum[][] = new int[..
11659번 문제와 완전히 유사한 구간합 문제이다. public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int a[] = new int[n]; int psum[] = new int[n+1]; StringTokenizer st = new StringTokenizer(br.readLine()); for(int i=0; i
이차원 배열의 구간합이다. 예제의 구간합 배열은 다음과 같다. 1 3 6 10 3 8 15 24 6 15 27 42 10 24 42 64 사각형 넓이 구할때와 마찬가지로 부분합 C = (A+B) + (A+B) - A = A + 2B 이다. 위 식대로 하면 표대로 배열의 값을 채워 넣을 수 있고 구간별 합을 구할때도 위 식을 활용한다. public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); i..
구간합 문제이다. 입력받은 배열 + 이전 배열을 더한 값을 저장하는 배열을 만들어 출력한다. a[] 5 4 3 2 1 psum[] 0 5 9 12 14 15 public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int m = Integer.parseInt(st.nextToken()); int a[] = new int..
완전탐색으로 로봇이 이동할 경로를 모두 체크해야 한다. 구현은 쉽지만 문제 해석이 잘 안되어서 참조하여 풀었다. 로직을 직접 해석하는 편이 좋을 것 같다. public class Main { static boolean visited[][] = new boolean[29][29]; static double a[] = new double[4]; static int dr[] = {-1, 1, 0, 0}; static int dc[] = {0, 0, -1, 1}; static double result = 0; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamRe..
DFS + 백트래킹 활용 문제이며, 색종이를 최소한으로 사용하려면 큰 종이부터 사용해야 한다는 점에서 그리디한 방식도 섞여있다. 1. 색종이 개수 정보를 담은 배열을 만든다. 2. 10x10 배열을 탐색하며 값이 1일 경우 5x5, 4x4, ..., 1x1 순으로 검사하며 붙일 수 있다면 붙인다. 3. 1을 모두 메꿀 수 없다면 최소값 갱신이 안되므로 -1을 출력한다. 4. DFS 도중 이미 최소값보다 색종이 사용 수가 크다면 함수를 종료해준다. 제한시간이 1초라서 가지치기를 해주었다. public class Main { static int paper[] = {0, 5, 5, 5, 5, 5}; static int a[][] = new int[10][10]; static int min = 100; publ..
최소값을 구해야 하므로 조건을 만족하는 수 중 가장 작은것을 우선 출력하게 해야한다. 그리디하게 생각해보면 첫번째 수는 무조건 1이 된다. 수를 이어붙일 때마다 좋은 수열인지 여부를 체크해준다. 11 : 수의 길이가 2이면 1번만 검사하면 된다. 1212 : 수의 길이가 4이면 밑줄친 1과 2 검사 1번 + 12, 12 검사 1번, 총 2번해야 한다. 123123 : 수의 길이가 6이면 2,3 / 31, 23 / 123, 123 총 3번해야 한다. 따라서 검사 횟수는 수의 길이/2이다. 검사할 인덱스 지정은 의식의 흐름대로 하여서 로직을 보는 편이 좋을 듯 하다. public class Main { static int n; public static void main(String[] args) throws..
문제의 해석이 좀 난해했다. 지문에서 알 수 있는 것은 1. 수는 1부터 N까지로 구성되어 있으며 연속된 수열이 아니면 제대로 복구된 수열이 아니다. 2. 수는 50을 넘지 않는다. 위 힌트를 바탕으로 풀이해보자. 1. DFS + 백트래킹으로 접근한다. 2. 수의 사용여부를 기록하는 배열을 만들어서 한번만 사용할 수 있게 한다. 3. 2의 조건을 만족할때 한글자씩 탐색한다. 4. 2의 조건을 만족하고 두글자가 50이하일 경우 탐색한다. 5. 입력받은 수열의 끝까지 탐색을 마칠 경우 수열을 검사하고 만족시 종료한다. public class Main { static String s; static boolean used[] = new boolean[51]; static int a[] = new int[50];..