가장 많이 본 글

2014년 9월 17일 수요일

Algorithm. 실수 연산

프로그래밍 중 실수 연산이 문제가 되는 경우가 왕왕 있음.

오늘도 algorithm 문제 풀다 한번 위기에 봉착해서 오답노트겸 적어놓는다.

package com.yongk.algospot.RATIO;
import java.util.Scanner;

public class RATIO {

 public static void main(String[] args) {
  Scanner sc = new Scanner(System.in);
  int T = Integer.parseInt(sc.nextLine());
  while(T-- > 0) {
   long N = sc.nextLong();
   long M = sc.nextLong();
   System.out.println(getMinimumTick(N, M));
  }
 }

 private static long getMinimumTick(long N, long M) {
  
  long Z = (long)(1 + M * 100 / N);
  if (Z >= 100) return -1;
  return (long)Math.ceil((Z * N - 100 * M) / (100 - Z));

 }
}
위에서 틀린 것을 찾아보면..
Math.ceil에 들어가는 인자가 long으로 연산되어 double로 cast 되어 Math.ceil에 입력됨.
 private static long getMinimumTick(long N, long M) {
  
  long Z = (long)(1 + M * 100 / N);
  if (Z >= 100) return -1;
  return (long)Math.ceil((double)(Z * N - 100 * M) / (100 - Z));

 }
로 변경이 필요하다. 별 것 아닌데 개고생함.

결론:
1. 가급적이면 실수 연산을 정수 연산에 섞지 않고
2. 섞어야 한다면 캐스팅 반드시 할 것

댓글 없음: