목록Data Structure & Algorithm/PS - JAVA (270)
Dev.baelanche

짱짱 쉬운 문제이다. 사각형의 특성상 같은 x좌표에 점이 두개, 같은 y좌표에 점이 두개 있어야 한다. 주어진 입력에서 x, y 좌표 각각에 왕따인 수를 찾아주면 된다. 구현방법은 엄청 많겠지만 간단한 문제인 만큼 편하게 짰다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x[] = new int[1001]; int y[] = new int[1001]; for(int i=0; i

A, B, C, D 배열의 각각을 더해서 0과 비교하기에는 시간이 너무 오래걸린다. 1. A, B의 모든 부분합을 저장한 배열을 만든다. (C, D의 부분합 배열이어도 상관없다.) 2. C, D의 모든 부분합을 저장한 Map을 만든다. 부분합 중 중복된 수가 있다면 카운트를 올린다. Map의 Key를 sum, Value를 카운트로 사용했다. 3. A, B의 부분합 배열과 Map의 원소들을 비교하며 두 원소의 합이 0일 경우 카운트만큼 개수를 올린다. 코드는 알아보기 꽤나 쉽다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int temp..

기존 점화식은 Y / X * 100 이지만 y에 비해 x가 무진장 크다면 0.0000xxxx.... 가 되어 100을 곱해도 0이 되게 된다. 따라서 Y * 100 / X 로 점화식을 짜주고 y * 100이 int의 범위를 벗어날 수 있으므로 long타입으로 해준다. X와 Y가 같지 않은 이상 절대로 확률이 100%가 될 수 없으므로 Y * 100 / X 가 99이면 -1을 출력한다. 그 외의 경우에는 이분탐색으로 기존의 승률보다 높으면서 판수가 가장 적을때를 찾아낸다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); long x = sc.nextInt(); long y = sc..

동원 끝나고 첫 포스팅이다! 여러 방법으로 풀 수 있겠지만 수학으로 풀었다. 정상에 올라간 후에는 미끄러지지 않으므로 내려갈때의 횟수가 1만큼 적다. A = 2, B = 0, V = 5 인 경우, 3번만에 올라갈 수 있지만 x = (5 - 0)/(2 - 0) = 2 로 소수점 이하가 생길시 +1을 해줘야한다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); int v = sc.nextInt(); System.out.println((v-b)%(a-b) == 0 ? (v-b)/(a-b) : (v-b)/(a..

투포인터를 통해 hi * hi - low * low 와 G를 비교한다. 투포인터 탐색을 언제 멈출건지가 가장 중요한데, low + 1 = hi 이고 두수의 제곱의 차가 G보다 작으면 더이상 연산할 필요가 없다. 또한 현재 몸무게와 이전 몸무게는 모두 자연수로 0이 될 수 없다는 점을 주의하자. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int g = sc.nextInt(); int lo = 1; int hi = 1; boolean f = false; while(true) { long minus = (long)(Math.pow(hi, 2)) - (long)(Math.pow(l..

배열의 부분합을 투포인터 기법으로 찾아낸다. 투포인터가 언제나 최소길이의 합을 사용하므로 sum >= s 만 비교해주면 된다. 최초에 초기화한 최소 길이에 변화가 없다면 0을 출력해준다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int s = sc.nextInt(); int a[] = new int[n]; for(int i=0; i= s) { sum -= a[lo++]; min = Math.min(min, hi-lo+1); } else if(hi == n) break; else sum += a[hi++]; } System.out.pr..

소수리스트를 만들어 놓고 투포인터 기법으로 수열의 합과 N을 비교한다. 투포인터 기법 자체가 연속된 배열을 사용하므로 문제에서 요구하는대로 풀 수 있다. public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); boolean prime[] = new boolean[n+1]; for(int i=2; i

신나는 완전탐색 문제다. 방문배열을 백트래킹 하며 진행했다. public class Main { static int n; static boolean visited[]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); visited = new boolean[n+1]; dfs(0, ""); } public static void dfs(int cnt, String s) { if(cnt == n) { System.out.println(s); return; } for(int i=1; i