import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
for (int i=0;i<n;i++) {
String[] temp = br.readLine().split(" ");
int M = Integer.parseInt(temp[0]);
int N = Integer.parseInt(temp[1]);
int x = Integer.parseInt(temp[2]);
int y = Integer.parseInt(temp[3]);
int ans = caing(M, N, x, y);
System.out.println(ans);
}
}
// 브루트 포스
// N과 M의 최대값은 각 4만이므로 최다 경우의 수는 N*M인 16억이다.
// 1억개의 경우의 수가 1초가 걸린다는 것을 감안하면 모든 경우의 수를 고려하기에는 경우가 너무 많다.
// 그러므로 고려할 필요가 없는 경우들은 건너뛰면서 경우들을 고려한다.
// 예를 들어 x=2이고 M=10이라면 x=2인 경우는 10의 주기로 등장한다.
// (2, y), (3, y), ... , (1, y), (2, y)
// 그러므로 x 값의 M 값을 주기로 하여 확인하고, y값은 그렇게 확인한 경우들 중 입력 값과 일치하는 값을 찾으면 된다.
// 위로 도출된 경우의 수들은 총 N개이다.
// 이 방법을 통해 O(M*N)이였던 시간복잡도는 O(N)으로 줄일 수 있다.
// (N이 더 작은 경우에는 y 값을 N주기로 경우의 수를 처리하도록하면 O(M)으로 만들 수도 있다.)
static int caing(int m, int n, int x, int y) {
if (m < n) {
for (int k=x;k<(n*m); k+=m) {
int temp = k%n;
if (temp == 0) temp = n;
if (temp == y) {
return k;
}
}
} else { // m > n
for (int k=y;k<(n*m); k+=n) {
int temp = k%m;
if (temp == 0) temp = m;
if (temp == x) {
return k;
}
}
}
return -1;
}
}
'알고리즘 > 백준 알고리즘(JAVA)' 카테고리의 다른 글
JAVA)15649번 N과 M (1) - 브루트 포스 (0) | 2020.08.04 |
---|---|
JAVA)1748번 수 이어쓰기 1 - 브루트 포스 (0) | 2020.08.04 |
JAVA)14500번 테트로미노 - 브루트 포스 (0) | 2020.08.03 |
JAVA)1107번 리모컨 - 브루트 포스 (0) | 2020.08.03 |
JAVA)1476번 날짜 계산 - 브루트 포스 (0) | 2020.08.03 |
전체 글
133개JAVA)6064번 카잉 달력 - 브루트 포스
import java.io.*; public class Main { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.08.03 starmk95JAVA)14500번 테트로미노 - 브루트 포스
import java.util.*; public class Main { static int[][] value; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); // 세로크기(행) int M = sc.nextInt(); // 가로크기(열) value = new int[N][M]; // 각 칸의 값 받아서 2차월 배열에 저장 for (int i=0;i= 0) { int temp = value[i][j] + value[i+1][j] + value[i+1][j-1] + value[i+2][j-1]; if (ans < temp) ans = temp; } if (j+2 < M) { in..
알고리즘/백준 알고리즘(JAVA) 2020.08.03 starmk95JAVA)1107번 리모컨 - 브루트 포스
import java.util.*; public class Main { static boolean[] brokenBtn = new boolean[10]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int channel = sc.nextInt(); int brokenNum = sc.nextInt(); int ans = Math.abs(channel-100); for (int i=0;i // 100번으로 이동은 숫자버튼 누를 필요 없다. // 101번으로 이동은 + 1번 누르는 것이 최소 // 102번으로 이동은 + 2번 누르는 것이 최소 // 99번으로 이동은 - 1번 누르는 것이 최소 if (channel =..
알고리즘/백준 알고리즘(JAVA) 2020.08.03 starmk95JAVA)1476번 날짜 계산 - 브루트 포스
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int E = sc.nextInt(); int S = sc.nextInt(); int M = sc.nextInt(); int findE = 1; int findS = 1; int findM = 1; int year = 1; // 브루트 포스 // 입력된 ESM 값이 나올 때까지 각 ESM 값을을 1에서부터 1씩 늘려가고 // 그렇게 구한 year 값을 출력 while (true) { if (findE == E && findS == S && findM == M) break; findE += 1; i..
알고리즘/백준 알고리즘(JAVA) 2020.08.03 starmk95JAVA)3085번 사탕게임 - 브루트 포스
import java.util.*; public class Main { static char[][] candy; static int ans = 1; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int cnt = sc.nextInt(); candy = new char[cnt][cnt]; for (int i=0;i 상하좌우 4가지 경우) // 그러나 첫 원소부터 오른쪽 또는 아래의 원소와 바꾸다보면 다음 원소에서의 위 또는 왼쪽 원소와 바꾸는 연산은 중복되는 연산이므로 수행할 필요가 없다. // 그러므로 각 원소마다 오른쪽과 아래의 원소만 교환하는 경우만 생각하면 된다. -> 2(n^2) // 바꾼 칸의 경우마다 ..
알고리즘/백준 알고리즘(JAVA) 2020.08.02 starmk95JAVA)2309번 일곱 난쟁이 - 브루트 포스
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] dwarf = new int[9]; int sum = 0; for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.08.02 starmk95JAVA)11057번 오르막길 - 다이나믹 프로그래밍
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int mod = 10007; int[][] A = new int[n][10]; // A[i][j] = 길이가 i이고 마지막 숫자가 j인 오르막수의 개수 // Bottom-Up 방식 // 점화식 : A[i][j] = A[i-1][0] + A[i-1][1] + ... A[i-1][j] for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)1309번 동물원 - 다이나믹 프로그래밍
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int mod = 9901; int n = sc.nextInt(); int [][] A = new int[3][n]; // A[0][n] = n번째 칸에 배치안하는 경우의 수, A[1][n] = n번째 칸의 왼쪽에 배치하는 경우의 수, A[0][n] = n번째 칸의 오른쪽에 배치하는 경우의 수 // Bottom-Up // 점화식 : A[0][i] = A[0][i-1] + A[1][i-1] + A[2][i-1] // A[1][i] = A[0][i-1] + A[2][i-1] // A[2][i] = A..
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)1149번 RGB거리 - 다이나믹 프로그래밍
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int cnt = sc.nextInt(); int[][] costs = new int[cnt][3]; // i번째 집을 각 색으로 칠하는데 드는 비용 (0행은 Red, 1행은 Green, 2행은 Blue) int[][] A = new int[cnt][3]; // 1~n번째 집들을 각 색으로 칠하는데 드는 최소 비용 (0행은 Red, 1행은 Green, 2행은 Blue) for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)2225번 합분해 - 다이나믹 프로그래밍
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); long[][] cases = new long[n+1][k+1]; // 0~n까지의 정수 k개를 더해서 그 합을 n으로 만드는 경우의 수 long mod = 1000000000; // Bottom-Up 방식 // 점화식 : cases[n][k] = cases[0][k-1] + cases[1][k-1] + ... + cases[n][k-1] cases[0][0] = 1; for (int i=1;i
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)1699번 제곱수의 합 - 다이나믹 프로그래밍
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); int[] A = new int[num+1]; // A[i] = i를 제곱수로 나타냈을때, 필요한 항의 최소 개수 // Bottom-Up 방식 // 점화식 : A[i] = min(A[i-j*j] + 1) (1
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95JAVA)1912번 연속합 - 다이나믹 프로그래밍
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int cnt = sc.nextInt(); int[] numbers = new int[cnt]; // 입력받은 수들을 기록 int[] sums = new int[cnt]; // 연속된 수의 합을 기록 for (int i=0;i
알고리즘/백준 알고리즘(JAVA) 2020.07.28 starmk95