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');
이렇게 한줄로 간단하게 구하는 방법도 사용하더라. 이런 방법도 있다는것을 알게 된 것에 만족한다.
이 과정을 자세히 설명하면
- Integer.toString(x) : 주어진 수를 String으로 변환
- chars() : 문자열을 'IntStream'으로 반환. 이때 각 문자는 ASCII 로 변환된다.
- forEach(c->sum+=c-'0') : 각 문자의 ASCII 값을 가져와서 '0' 문자의 ASCII 값을 빼주어 실제 숫자 값을 얻는다. 이후 얻은 숫자 값을 sum 변수에 더합니다.
- 문자열에서 '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; 로 끝내면 단 두줄로 끝나기도 한다.