카테고리 없음

백준 4084. Viva la Diferencia (JAVA)

joah.k 2023. 2. 24. 17:30
728x90

https://www.acmicpc.net/problem/4084

 

4084번: Viva la Diferencia

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, a, b, c, d가 순서대로 주어진다. 입력의 마지막 줄에는 0이 4개 주어진다. (1 ≤ a,b,c,d ≤ 2,000,000,000)

www.acmicpc.net

 

Viva la Diferencia 

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 1258 947 886 77.178%

문제

네 개의 양의 정수 a, b, c, d가 있을 때, 아래와 같이 차이를 계산할 수 있다.

|a-b| |b-c| |c-d| |d-a|

이렇게 나온 네 개의 수를 이용해서 다시 또 차이를 계산할 수 있다. 이 작업을 모든 네 개의 정수가 같아질 때까지 반복한다.

예를 들어, 1, 3, 5, 9로 시작했을 때를 생각해보자.

1 3 5 9

2 2 4 8 (1)

0 2 4 6 (2)

2 2 2 6 (3)

0 0 4 4 (4)

0 4 0 4 (5)

4 4 4 4 (6)

위의 경우에서 수열은 6번 만에 수렴한다. a, b, c, d가 주어졌을 때, 이 수열이 얼마나 빨리 수렴하는지 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, a, b, c, d가 순서대로 주어진다. 입력의 마지막 줄에는 0이 4개 주어진다. (1 ≤ a,b,c,d ≤ 2,000,000,000)

출력

각 테스트 케이스에 대해서, 수열이 몇 번 만에 수렴하는지 출력한다.

예제 입력 1 복사

1 3 5 9
4 3 2 1
1 1 1 1
0 0 0 0

예제 출력 1 복사

6
4
0

힌트

만약 네 정수가 2n보다 작다면, 3*n번 이내에 수렴한다.

 

 


풀이 : 단순 계산 문제. 

다만 처음에 temp 를 정의하지 않고 바로 a,b,c,d 에 연산문을 넣었더니 값이 달라지는 실수가 있었다. 

바로 a,b,c,d에 넣어버리면 

a 까지는 괜찮겠지만 그 이후부터는 값이 달라지게 된다. 연산 결과가 이미 적용된 수가 들어가기 때문. 

이 부분을 놓쳐서 아쉬웠다. 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true){
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            int d = Integer.parseInt(st.nextToken());


            if(!(a==0 && b==0 && c==0 && d==0)) {
                int cnt = 0;
                while (!(a==b && b==c && c==d && a==c && a==d && b==d)) {
                    int tempA = Math.abs(a-b);
                    int tempB = Math.abs(b-c);
                    int tempC = Math.abs(c-d);
                    int tempD = Math.abs(d-a);
                    a = tempA;
                    b = tempB;
                    c = tempC;
                    d = tempD;
                    cnt++;
                }
                System.out.println(cnt);
            }else break;
        }
    }
}

 

728x90