TIL

2024.05.02.목

Nellucia 2024. 5. 2. 21:35

 

정답률 낮은 문제부터 풀다가 오늘은 높은 순서대로 풀어 봤다.

 

 

 

나머지가 1이 되는 수 찾기

 

class Solution {
    public int solution(int n) {
        int answer = 0;
        int modNum = n-1;
        while(modNum>1)
        {
            if(n% modNum == 1)
            {
                answer = modNum;
            }
            modNum--;
        }
        
        return answer;
    }
}

 

 

 

X만큼 간격이 있는 숫자

 

class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        
        for(int i=0;i<n;i++)
        {
            answer[i] = (long)x*(i+1);
        }
        
        return answer;
    }
}

answer[i] = (long)x*(i+1); 에서 long으로 형변환 안했다가 한번 틀렸다.

 

 

하샤드 수

 

 

 

 

 

import java.util.ArrayList;
class Solution {
    public boolean solution(int x) {
        
        ArrayList<Integer> list = new ArrayList<Integer>();
        
        int i=1;
        int temp = x;
        while(temp!=0)
        {
            list.add(temp%10);
            temp/=10;
        }
        
        int sum =0;
        for(var index : list)
        {
            sum+=index;
        }

            return x%sum == 0 ? true : false;
        }
    }
}

각 자리의 수를 구하는 과정을

Integer.toString(x).chars().forEach(c -> sum += c - '0');

이렇게 한줄로 간단하게 구하는 방법도 사용하더라. 이런 방법도 있다는것을 알게 된 것에 만족한다.

 

이 과정을 자세히 설명하면

  1. Integer.toString(x) : 주어진 수를 String으로 변환
  2. chars() : 문자열을 'IntStream'으로 반환. 이때 각 문자는 ASCII  로 변환된다.
  3. forEach(c->sum+=c-'0') :  각 문자의 ASCII  값을 가져와서 '0' 문자의 ASCII 값을 빼주어 실제 숫자 값을 얻는다. 이후 얻은 숫자 값을 sum 변수에 더합니다.
    1. 문자열에서 '0'의ASCII코드를 빼는 이유 : 문자 '0'부터 '9'까지의 ASCII값은 연속적으로 증가한다.이 때 '0'의 ASCII값은 48이고 '1'은 49이기 때문에 ASCII로 변환된 값을 실제 주어진 정수 값과 같은 값으로 변환하기 위해서 '0'의 ASCII값을 뺀다. 따라서 forEach(c->sum+=c-'0')의 의미는 아스키코드로 변환된 값들의 실제 정수값을 구해 sum에 각각 더하는 것이다.

여기에 마지막으로 return x%sum== 0 ? true : false; 로 끝내면 단 두줄로 끝나기도 한다.