[99클럽 코테 스터디 1일차 TIL] 백준 1072번 게임

말하는 감자·2024년 10월 28일
0
post-thumbnail

99클럽 코테 스터디 1일차 TIL

💜 JAVA 미들러

📌 공부한 내용

📍 오늘의 문제

📍 작성 코드

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		long x = sc.nextLong();
		long y = sc.nextLong();
		int z = (int)(y * 100 / x);
		
		int round = -1;
		
		if(z < 99) {
			round = (int) Math.ceil((100 * y - (z + 1) * x) / (double) (z - 99));
		}

		System.out.println(round);
	}

}

📌 오늘의 회고

수학 계산하느라 고생했다...

제한사항을 보면 x는 1,000,000,000을 넘는다. 그러면 int로 값을 받는 것이 어렵다고 느껴져 xy를 long으로 값을 받았다.

long x = sc.nextLong();
long y = sc.nextLong();

먼저 승률 z를 구해야 했다.
z = y / x * 100; 로 구했더니 정수가 아닌 소수로 계산이 되면서 냅다 0이 되어버리는 현상이 생겼다. 그래서 yx로 나누는 것이 아니라 100을 곱하는 것을 먼저 실행시키도록 하였다.

z = y * 100 / x;

김형택이 앞으로 계속 이기기만 한다면 승률z가 변할 수 있는 방법은 오로지 +1이다.
그래서 z가 +1을 하려면 몇판(a)을 더 해야하는 지 계산했다.

z + 1 = (y + a) / (x + a) * 100
z + 1 = (100y + 100a) / (x + a)
(z + 1)(x + a) = 100y + 100a
(z + 1)x + (z + 1)a = 100y + 100a
(z + 1)x + (z - 99)a = 100y
(z - 99)a = 100y - (z + 1)x
a = (100y - (z + 1)x) / (z - 99)

이를 코드로 풀어내고 around가 소수일 수 있으므로 Math.ceil()함수를 통해 올림처리 해주었다.

round = (int) Math.ceil((100 * y - (z + 1) * x) / (double) (z - 99));

위 식을 실행하기 전에 제약조건을 하나 걸었는데 이미 모든 판을 이긴 100%의 승률이거나 거의 다 이겼으나 한판이라도 진 승률 99%인 경우 100%로 올라갈 수 없기 때문에 99%미만의 경우에만 위 식을 실행시켰고 99% 이상인 경우 -1을 출력하게 해놨다.
(처음에 100퍼 미만으로 설정했다가 여러번 틀렸습니다를 보고 깨달았다...😢)

int round = -1;
		
if(z < 99) {
	round = (int) Math.ceil((100 * y - (z + 1) * x) / (double) (z - 99));
}

System.out.println(round);


📍 개선 코드

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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] s = br.readLine().split(" ");
		
		long x = Long.parseLong(s[0]);
		long y = Long.parseLong(s[1]);
		int z = (int)(y * 100 / x);
		
		int round = -1;
		
		if(z < 99) {
			round = (int) Math.ceil((100 * y - (z + 1) * x) / (double) (z - 99));
		}

		System.out.println(round);
	}

}

사실 업무하면서 변수를 직접 입력 받을 일이 없다보니 값을 입력받기 위해 뭘 써야하더라 하고 당황했다. 가장 먼저 떠오른 Scanner를 사용했는데 BufferedReader를 사용하면 속도가 빨라진다고 해서 한창 연습했던 기억이 나 BufferedReader로 변경하여 작성해봤다.

위에가 BufferedReader, 아래가 Scanner를 사용한 결과이다.
확실히 속도차이가 많이 난다.
Scanner보다 BufferedReader를 사용하는 걸 다시 연습해야겠다.


질문 게시판을 통해서 이분 탐색을 통해서 구하는 방식이 더 많다는 것을 알게되었다.
이분 탐색도 공부해봐야겠다.

profile
나는 말하는 감자다

0개의 댓글