3 / 16 정리

안대륜·2022년 3월 16일

25 정수 제곱근판별

  • 생각해야할것
    n은 long 타입이고 , n의 제곱근을 구하기
class Solution {
    public long solution(long n) {
		long sqrt = (long) Math.sqrt(n);
        return Matn.pow(sqrt ,2)==n ? (long)Math.pow(sqrt +1 ,2) : -1;
    }
}
  • 풀이
    n의 값은 long타입으로 지정되있기 때문에
    long sqrt = Math.sqrt(n); 을통해 입력된 n의 제곱근 값을 가져온다
    그래서 막약 입력된 n의값이 Math.pow(sqrt, 2)를 통해 제곱값이 맞다면
    return (long) Math.pow(sqrt+1,2); 를 통해n의 제곱근값에 1을 더해서 제곱해준다
    그렇지않으면 -1 반환

26 제일 작은 수 제거하기

  • 생각해야할것
    최솟값을 제거해야하는데 1개의 값만 있으면 값이 없는게 되어버리므로 -1을 리턴한다
class Solution {
  public int[] solution(int[] arr) {
      if(arr.length == 1){ // arr의 길이가 1이라면
          int[] answer = {-1}; // 정수배열 answer의 값은 -1이다.
          return answer; //그때 리턴
      }

      int[] answer = new int[arr.length-1];//최솟값하나를 빼주면 자연스레 길이도 하나 줄어듬
      int minIndex=0; //최솟값

      for(int i=0;i<arr.length;i++){
          if(arr[minIndex]>arr[i]){ // 결국에는 가장작은수가 나옴
              minIndex = i;
        // ex) 4 -> 3 -> 2 -> 1              
          }
      }
      for(int i=minIndex+1;i<arr.length;i++){
          arr[i-1] = arr[i];
      }
      for(int i=0;i<answer.length;i++){
          answer[i] = arr[i];
      }
      return answer;
  }
}
  • 풀이

27 콜라츠 추측

  • 문제 설명
    1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야하는지 반환하는 함수, solution을 완성해 주세요. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.

제한 사항
입력된 수, num은 1 이상 8000000 미만인 정수입니다.
입출력 예

입출력 예 설명
입출력 예 #1
문제의 설명과 같습니다.

입출력 예 #2
16 -> 8 -> 4 -> 2 -> 1 이되어 총 4번만에 1이 됩니다.

입출력 예 #3
626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야합니다.

  • 생각해야 할것
    입력된 수가 짝수라면 2를 나눠준다.
    입력된 수가 홀수라면 3을 곱하고 1을 더해준다.
    1이될때까지 반복실행해야한다.
class Solution {
	public int solution(int n) {
	long num =n; //오버플로우 방지를위한 형변환
    int count =0;
    
    while(num !=1) {
    if (num % 2 ==0)  //짝수일 경우
    	num /= 2;
     else  //홀수일 경우
    	num =num*3+1;
        count++;
        if (count >500)
       		return -1;
    }
    return count;
    }
    }
  • 풀이
    - 매개변수로 입력 받은 int형 n값을 long으로 바꿔주지 않으면 , 예제 3번에서 488이라는 결과가 나옴
    입력받은 n값을 int형으로 그대로 사용하면 100번째 근처에서 오버플로우가 나와서 음수로 한 번 바뀌기 때문에 결과값이 꼬이게됨
    -입력받은 값이 1이 될때까지 반복실행해주는데 짝수일경우는 2를나눈 몫값이 num이되고 홀수일경우는 num값에 3을곱하고 1을 더한값이되며 이런과정이 생길때마다 카운트를 증감해준다
    과정이 500번넘어가면 -1을 출력해준다
    -마지막으로 카운트를 리턴해주면 총 몆번의 과정을 반복했는지 알수있다.

28 하샤드 수

  • 생각해야할것
    입력된숫자의 각자리의 숫자를 더해서 나누어지는것이 하샤드 수이다
    예 ) 150 = 1+5+0 =15 , 150 /15는 나누어 떨어진다
class Solution {
	public boolean solution(int x) {
    int sum =0;
    int n =x;
    while ( n >0 ) {
    sum += n %10; //(나머지값을 알수있음)
    n/=10; //(앞자리수를 구해서 1보다 작아질때까지 계속 반복시킴)
    }
    return x %sum ==0 ? true :false;
    }
    }
  • 풀이
    먼저 결과값을 담을 변수를 선언해준다
    입력값 x 를 변수n에 대입시켜 반복문을 돌릴때 sum값을 찾는데 이용한다
    와일문을 통해 조건이 맞으면 계속 반복하게 한다
    입력값이 150이라면
    sum값에 0 , 5 ,1 순서로 들어가게된다
    입력값과 입력값 각자리정수들의 합을 나누었을때 맞아 떨어지면 트루 그렇지않으면 거짓이 나온다.

if , else 뒤에 한줄씩은 괄호를 안써도 인식을 한다.
Math.sqrt() - 제곱근으로 변환시키기
Math.pow(제곱근(6) , 제곱수(3)) = Ex) 6의3제곱이라는뜻임

0개의 댓글