ZeroOne 알고리즘 질문

  • SLoVey
    SLoVey

    ZEROONE
    ZeroOne 문제를 풀었지만 계속 오답이 발생합니다.
    경계값, 초과값 등 여러가지를 입력에도 옳은 대답이 나오는걸 보니 아마도 알고리즘 작성에서 오답이 난 것같습니다.
    제 알고리즘은 1과 0의 비교를 통한 최대값 최소값을 구하는 것이 아니라, 1이 최소값인 경우와 0이 최대값인 경우만 생각하여 1111 or 0000 의 문자열과 비교를 하는 알고리즘을 만들었습니다.
    이런 알고리즘 같은 경우에는 문제의 의도와 벗어나는 것인가요?

    아래는 java로 작성한 코드 전문입니다.

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

    public class ZeroOne {
    public static void main(String arg[]) throws IOException{
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    String zeroOneArray = "";
    zeroOneArray = in.readLine();
    int numQuestion = Integer.parseInt(in.readLine());
    String[] range ;
    range = new String[numQuestion];
    for(int i=0; i < numQuestion ; i++){
    range[i] = in.readLine();
    }
    for(int i=0; i < numQuestion ; i++){
    comparison(zeroOneArray, range[i]);
    }
    }

    //비교 메서드
    //입력 : zeroone array, 비교 범위
    //비교방식: 범위 내 zero one array이가 1또는 0으로만 이루어져 있는지 비교
    //출력 : 1또는 0으로만 이루어져 있으면 Yes, 섞여있으면 No
    static void comparison(String array, String range){
    StringTokenizer st = new StringTokenizer(range);
    int token1 = Integer.parseInt(st.nextToken());
    int token2 = Integer.parseInt(st.nextToken());
    if (token1 > token2){
    int temp = token1;
    token1 = token2;
    token2 = temp;
    }
    token2++;
    String StringOne = ((int)Math.pow(10,token2-token1)-1)/9 + "";
    String StringZero = ((int)Math.pow(10,token2-token1) +"").substring(1);
    if (token2 > array.length()){
    System.out.println("No");
    }
    else if(array.substring(token1, token2).equals(StringOne) || array.substring(token1, token2).equals(StringZero)){
    System.out.println("Yes");
    }
    else{
    System.out.println("No");
    }
    }
    }


    10년 전
2개의 댓글이 있습니다.
  • 일루
    일루

    Math.pow의 return형이 double일텐데 그렇다면 정확도 문제로 10^100-1 을 했을 때 원하시는 정확한 값이 나오지는 않을 것 같습니다.


    10년 전 link
  • SLoVey
    SLoVey

    와우 감사합니다. 그렇군요 단순히 int로 치환해주는걸로 해주는 문제가 아니었습니다. 범위가 초과하는군요 감사합니다. 큰 도움되었습니다. 감사합니다!


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.