정수 제곱근 판별

SaGo_MunGcci·2022년 7월 20일
0

문제 접근

  1. 먼저 입력받은 숫자를 루트를 사용해서 값을 계산한다.
    1) 121이 11의 제곱이니까 121을 루트를 사용하면 11이나온다.

  2. 루트해서 나온값이 소수점이면 제곱근이 아니니까 정확하게 하기위해서 float로 값을 도출한다. --> 이부분 때문에 처음에 프로그래머스 광탈함
    1) 11.0이 나오도록 유도한다.

  3. 11.0을 String으로 바꾼다.

  4. String []로 split을 사용해서 11.0을 배열에 넣는다.

  5. "."바로뒤 숫자가 0이면 제곱근이니까 (제곱근 +1) * (제곱근+1)을 해서 반환단다. 만약 "."이후의 숫자가 0이 아니면 제곱근이 아니라서 -1을 반환한다. (여기서 문제가 있는것 같다. 잘 모르겠지만 이 로직이 찜찜하다.)

  • 코드 작성

public class Q25 {

    public long solutionQ25(long n) {	    
    
     long answer = 0;
//
        //System.out.println(Math.sqrt(n));

        //long도 정수형 타입이다.

        double temp =  Math.sqrt(n);

        String temp_ex = Double.toString(temp);

//        String ex = "11.0";
//        System.out.println(ex);

        //System.out.println(temp_ex);

        String [] str_arr = temp_ex.split("");

        //System.out.println(Arrays.toString(str_arr));

        if(n != 0) {

            long count = 0;

            for (long i = 0; i < str_arr.length; i++) {

                if (str_arr[(int) i].equals(".")) {

                    count = i;

                }

            }

            //System.out.println(count);

            for (long i = count; i < str_arr.length; i++) {

                //System.out.println(str_arr[count+1]);
                if (str_arr[(int) (count + 1)].equals("0")) {
                    answer = (long) ((temp + 1) * (temp + 1));
                    return answer;


                } else if (!str_arr[(int) (count + 1)].equals("0")) {
                    answer = -1;
                    return answer;


                }

            }
        }
        
                return answer;
    }

}
    
  • 결과

  • 문제 재접근

  • 나의 로직에 문제가 있는 것 같은데 잘 못찾겠다.

  • double temp = Math.sqrt(n); 이부분이 처음에 문제였다 나는 처음 double이 아닌 float로 사용하였는데 제한사항이 무려 50조다 보니까 float보다 double을 생각 못했다.

  • double을 사용하는 것도 팀원분중 한분과 얘기하다가 알게 되었다.

  • 그리고 그 팀원분이 짠 코드가 기가 막히다. 내가 본 코드 중 이해가 되면서 동시에 손가락 안에 꼽는 인상깊은 코드가 될 것이다.
    (심지어 그 팀원분은 자바를 시작한지 1주일안되었다.......)

  • 코드 소개


public class Q25 {

    public long solutionQ25(long n) {

        double x = Math.sqrt(n);

        if(x == (int )x){

            return(long) Math.pow(x+1,2);
            
        }else {
        
            return -1;
            
        }
      }
   }
  • 처음에 푸셨다고 하시고 이 코드를 보여주셨는데 이게 돌아갈까라고 생각했는데 프로그래머스에 바로 통과되었다.

  • 이 코드를 보면서 누군가에게는 최선을 다한 코드이고 다른 사람이 보기에는 투박하고 이상해 보일지라도 이런 정성과 노력이 들어있는 코드가 세상을 움직인다고 나는 생각한다. 나는 단순히 기계적으로 로직을 생각하고 합리적으로 결론을 도출하려고만 생각했지만 정말로 문제의 본질은 보지 못했다고 할 수있다.

  • 프로그래머스에 당당히 코드가 통과되자 마자 이상하고 투박하게만 보였던 코드가 정말 말그대로 아름다워보였다. 개발자 스스로 생각하고 수많은 로직을 구상하면서 나온코드가 아닌가? 결국 그것이 작동했고 해당 기능의 완성도는 100%였다.

  • 항상 이런 노력과 열정은 배워야겠다고 생각한다.

  • 인상깊은 하루였다.

profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글