현재 풀고 있는 시리즈
https://code.plus/course/41
import java.io.*;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int countOfBrother = Integer.parseInt(st.nextToken()); // 동생 수
int myPosition = Integer.parseInt(st.nextToken()); // 내 위치
Stack<Integer> stack = new Stack<>();
int currentPos = myPosition; // 수빈이의 현재 위치
st = new StringTokenizer(br.readLine());
for (int i = 0; i < countOfBrother; i++) {
int posOfBrother = Integer.parseInt(st.nextToken());
// 현재 내 위치 - 동생의 위치를 구한다. (-가 나오지 않도록 절댓값 메서드를 쓴다)
int distanceDiff = Math.abs(currentPos - posOfBrother);
stack.push(distanceDiff); // 스택에 거리차 값을 계속 push한다.
currentPos = posOfBrother; // 수빈이가 동생한테 갔으니 동생 위치로 현재 위치를 바꾼다.
}
int gcdResult = 0;
if (countOfBrother == 1) {
gcdResult = stack.pop();
} else if (countOfBrother == 2) {
gcdResult = recursiveGcd(stack.pop(), stack.pop());
} else {
// 동생이 3명 이상인 경우
int temp = recursiveGcd(stack.pop(), stack.pop());
while (!stack.isEmpty()) {
temp = recursiveGcd(temp, stack.pop());
}
gcdResult = temp;
}
System.out.println(gcdResult);
}
public static int gcd (int v1, int v2) {
while (v2 != 0) {
int tmp = v1;
v1 = v2;
v2 = tmp % v2;
}
return v1;
}
public static int recursiveGcd (int v1, int v2) {
int tmp = v1;
if (v2 == 0) {
return v1;
}
return recursiveGcd(v2, tmp % v2); // b(v2)가 0이 아니면 재귀호출
}
}
결과
문제 해석 못해서 오답
나는 수빈이 기준으로 동생들 사이의 거리를 가지고 계산하는 줄 알았는데,
수빈이가 첫번째 동생부터 차례로 각 동생들 위치로 가면서 계산을 해야 한다.
수빈이가 3에서 1에 있는 동생한테 가면 수빈이 위치는 1이 된다.
거기서 또 다른 동생한테 가는 데까지의 소요 거리를 계산하는 것이다.
마지막으로 최대공약수를 구할때 동생의 수가 1명부터 n명인데 이것을 어떻게 분기처리할지 고민을 많이 했다.
stack을 써서 낑낑대다가 화딱지가 나서 그냥 동생이 1명일 때, 2명일 때, 3명 이상일 때 분기처리를 했다.
재귀 좀 못해서 처음에 while 반복문으로 했다가 재귀 구조로 고쳤다.
후기
문제 이해력이 심각하다;;; 한 2-2.5시간 걸림.
https://kimhaksung.tistory.com/entry/python3GCD
https://adjh54.tistory.com/182
if(N==1){
answer = arr[0];
}
else {
answer = arr[0];
for(int i=1; i<N; i++){
gcd(answer, arr[i]);
}
}
System.out.println(answer);
3가지가 아니라 2가지 케이스로 분기처리하는 경우 가능함.
위의 경우는 배열을 쓴 경우다.