목록Study/Problem Solving (163)
전공공부
설명 문제를 살펴보면 두자릿 수에서만 행동하는 것을 알 수 있고 이때, 덧셈을 진행한다. 그렇기 때문에 10 기준으로 나누거나 나누기의 남은 수를 써서 두자릿 수를 나눠서 진행했다. 코드 package Math; import java.util.Scanner; public class BOJ_1110 { public static void main(String[] args) throws Exception{ Scanner sc = new Scanner(System.in); int N = sc.nextInt(); if(N < 10){ N*=10; } int n = N; int cnt = 0; while (true){ int first = n / 10; int second = n % 10; int tmp = (fi..
설명 진법을 변환하기 위해서는 현재 자릿수에서 존재하는 알파벳 또는 숫자를 진법에 맞게끔 한 자릿수 수정을 한다. 그리고, 그것을 누적해서 더해서 나아가면된다. 예시로 16진수 AB의 경우 10, 11인데 지금 자릿수가 11의 경우 1의 자릿수 10의 경우 다음 16번째를 넘긴 것이니 16을 곱한다. 16*10 + 11*1 이런식으로 풀 수 있다. 아래 코드가 이와 같다. 코드 1) API 사용 코드 package Math; import java.util.Scanner; public class BOJ_2745 { public static void main(String[] args) throws Exception{ Scanner sc = new Scanner(System.in); String B = sc...
설명 어떻게 접근할지는 대강 파악했으나 상세히 떠오르지 않아 블로그를 보고 푼 문제이다. 해당 코드는 2개의 지점을 먼저 잡아두고 10000*10000 이분 탐색으로 가능한 범위 내의 숫자들을 가져오는 코드이다. 이게 무슨 말이냐면 -1,-1,-1,-1,1,2,2,2,2,2,2,3 이런식으로 수열이 들어오면 만일 한 번 이분 탐색해서 찾으면 -1,-1 fix 값 빼고 left,right 지정 후 mid = (l+r)/2 으로 찾으면 당연히 그냥 가능한 수열중 딱 하나를 빠르게 찾을 뿐이다.... 이러면 안되고 lower boundary의 끝 부분과 지금 수열에서 가능한 부분인 [5 번째 인덱스 자리 부터 ~ 10 번째 인덱스 자리까지 탐색해야한다.] upper boundary의 끝을 알아내면 된다. N이..
설명 start 지점은 그저 처음 카운트 할 때 홀 수이면 초기화 해서 올라가기 위함이고 end는 계속 상승시키면서 만일, K 번을 초과하면 break해서 나오는 코드를 짰다. 그래서 연속한 긴 짝수 부분 수열을 구했다. 그리고, 처음에는 max라는 변수를 두고 짝수의 카운트 값을 잡았는데 이렇게 하면 초기화를 시키는 부분이 많아져서 end - start - cnt로 변경해서 풀었다. 코드 package two_pointer; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BOJ_22862 { public static void main(String[] ..
설명 어짜피 두개만 선택하는 경우의 수이고 이것을 모두 비교하면서 진행하는 백 트레킹 방식을 진행하기에는 100000C2 50억이므로 불가능 그래서 투포인터 방식을 사용해서 진행하는데 이때, 오름 차순으로 정렬 후 선택하게 되면 결국 앞에서 나가는 것은 무조건 음수에서 양수로 나아가는 방식이고 이를 토대로 start, end 조건을 걸어서 풀면 된다. 코드 package two_pointer; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.StringTokeniz..
설명 투 포인터로 접근하였고 처음 숫자의 크기만큼 배열을 짜서 각 숫자마다 가진 갯수를 뒤지는 식으로 풀었다. 사실 구현 할 때 맵 형태로 구현 해보았으나 생각보다 맵을 써서 푸는 것 보다 배열이 메모리나 속도 측면에서 더 빨랐다. 코드 package two_pointer; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BOJ_20922 { public static void main(String[] args) throws Exception{ BufferedReader in = new BufferedReader(new InputStreamReader(Sy..
설명 투 포인터를 활용하였다. 지금 조건이 맞으면 해당 건을 넣고 초기화 돌리는 식으로 진행함 코드 package two_pointer; import java.util.Scanner; public class BOJ_21921 { public static void main(String[] args) throws Exception{ Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int X = sc.nextInt(); int [] arr = new int[N]; for(int i = 0; i < N; i++){ arr[i] = sc.nextInt(); } int left = 0; int right = X - 1; int sum = 0; int coun..
설명 투 포인터를 구현하듯이 문제를 풀었다. 아무리 해도 시간 초과가 해결되지 않아서 여러 입출력 방법을 동원해서 풀었다. 코드 package two_pointer; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class BOJ_11728 { public static void main(String[] args) throws Exception{ BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer tk = new ..