22.10.07_모각코 2회차

2022. 10. 10. 22:24모각코

목표

- 객체지향프로그래밍 라이브 코딩 테스트 복습

내용

3.

윤년 문제

class Solution {
    public boolean solution(int year) {
        boolean answer = false;
        if (year % 4 == 0) {
            if (year % 100 != 0) {
                answer = true;
            } else if (year % 400 == 0) {
                answer = true;
            }
        }
        return answer;
    }
}

7.

문제 설명

주어진 숫자를 10의 제곱수로 만들기 위해 더해야 하는 숫자의 최솟값을 A라 하고, 빼야 하는 수의 최솟값을 B라고 할 때..
A 와 B 중에서, 더 큰 수를 리턴 하는 프로그램을 작성하세요.

필요하다면, Math.pow() 함수를 사용합니다. (ex. Math.pow(10, 5)는 10의 5제곱과 같습니다.)

입력 제한

  • 1보다 큰 양의 정수가 입력됩니다.
  • 10의 제곱수는 입력 값으로 주어지지 않습니다.

입출력 예

input                 result
2 8
99 89

예1 #
2에 1을 빼면 1이 되고, 8을 더하면 10이 됩니다. 따라서 1 과 8 중에서 더 큰 8을 리턴 합니다.

예2 #
99에 89를 빼면 10이 되고, 1을 더하면 100이 됩니다. 따라서 1과 89중에서 더 큰 89을 리턴 합니다.

class Solution {
    public int solution(int input) {
        int A = 0, B = input - 1, i = 0;
        while (true) {
            B = (int)Math.min(B, input - Math.pow(10, i));
            if (Math.pow(10, i+1) > input) {
                A = (int)Math.pow(10, i+1) - input;
                break;
            }
            i += 1;
        }
        return Math.max(A, B);
        
        // int A = 0, B = input-1, i = 1;
        // while (true) {
        //     B = Math.min(B, input-i);
        //     i *= 10;
        //     if (i > input) {
        //         A = i - input;
        //         break;
        //     }
        // }
        // return Math.max(A, B);
        
        // int i = 0; 을 while문 안에 넣으면 계속 값이 0으로 초기화 돼서 문제가 생긴 것..
        
        // 라코테 볼 때 짠 코드
        // int answer = 0, add = 0, sub = 0, cnt = 1;
        // int ex = input;
        // while (true) {
        //     if (ex < 10) { // input 말고 ex 넣으니 만점..
        //         break;
        //     }
        //     ex /= 10;
        //     cnt += 1;
        // }
        // add = (int)Math.pow(10, cnt) - input;
        // sub = input - (int)Math.pow(10, cnt-1);
        // answer = Math.max(add, sub);
        // return answer;
    }
}

9.

동준이는 평소에 숙제를 너무나도 하기 싫어한다.
그래도 숙제이기에 하기는 하지만, 미처 완료하지 못한 숙제들이 있다.

동준이의 부모님은 매우 엄하셔서 동준이가 숙제를 열심히 하기를 원한다.
때문에 숙제 완료율 프로그램에 동준이의 숙제 현황을 집어넣어 숙제 완료율이 떨어질 때 마다 동준이의 용돈을 삭감하기로 하였다.

하지만 동준이는 너무나도 숙제가 하기 싫었기에 꼼수를 찾아보았다.
숙제 현황 프로그램에 나오는 숙제 완료율은 정수 형태의 퍼센트 값으로 표시되기 때문에 한번 숙제를 안한다고 무조건 완료율이 떨어지지는 않는 것이다.

동준이는 몇 번까지 숙제를 안해도 완료율이 떨어지지 않는지를 알고 싶어한다.

지금까지 동준이에게 주어졌던 숙제의 수 X와 동준이가 완료한 숙제의 수 Y가 주어졌을 대, 동준이가 앞으로 몇 번까지 숙제를 안 할 수 있는지를 구하여라.

참고로, 지금 주어진 수치에서 숙제를 연속해서 안 할 수 있는 횟수를 구하는 것으로, 이 횟수를 세기 전, 세는 중간에 숙제를 하는 경우는 계산할 필요가 없다.

입출력 제한

  • X, Y는 100,000,000 이하의 음이 아닌 정수이다.
  • 숙제를 안 할 수 있는 최대 횟수를 리턴한다.
  • 숙제를 계속 안해도 확률이 변동되지 않는다면 -1을 리턴한다.

입출력 예시

입력값출력값

10000, 4710 21

4710 / 10000 = 0.471 (47%)
4710 / 10021 = 0.47001 (47%)
4710 / 10022 = 0.4699 (46%)

class Solution {
    public int solution(int X, int Y) {
        int answer = 0;
        long percent = (Y * 100) / X;
        if (percent == 0) {
            return -1;
        }
        while (true) {
            X += 1;
            if ((Y * 100 / X) < percent) {
                break;
            }
            answer += 1;
        }
        return answer;
    }
}

회고

- 개념적으로 부족하고 아직 파이썬에서 벗어나지 못했다는 것을 느꼈다.

- 윤년 문제에서는 포함 관계를 잘 생각해서 if-else문을 짜야 한다.

- while문에서 int i = 0;을 선언하면 루프가 돌 때마다 i값이 초기화 돼서 문제가 풀리지 않는다.

- 9번 문제의 경우 자바의 데이터 타입에 익숙하지 않아서 수가 대략 21억보다 커지면 int 대신 long을 사용해야 한다.

  혹은 double 강제 타입 변환을 하여 / 연산자를 쓸 때 버림이 되지 않도록 해야 한다.

'모각코' 카테고리의 다른 글

22.11.25_모각코 6회차  (1) 2022.11.30
22.11.18_모각코 5회차  (0) 2022.11.30
22.11.11_모각코 4회차  (0) 2022.11.30
22.11.04_모각코 3회차  (0) 2022.11.07
22.09.30_모각코 1회차  (1) 2022.09.30