View

😃 || 정리
주어진 숫자의 각 자릿수를 2 제곱해서 더한 수가 최종적으로 1이 되면 happy number로 true를 반환하고, 그렇지 않으면 false를 반환하게 된다. 어떤 규칙이 있을까 2~10까지 숫자를 직접 해본 결과 happy number가 아니면 같은 수가 반복되어 나오는 것을 알게 되었다.
그래서 배열에 합계들을 넣고 , 중복이 되면 안되므로 Set 컬렉션을 쓰기로 했다. 그리고 만약 중복되는 숫자가 들어오면 false를 반환하도록 만들기로 했다.
😃 || 풀이 방법
import java.util.*;
class Solution {
public boolean isHappy(int n) {
String num = n + "";
HashSet<Integer> unHappySet = new HashSet<Integer>();
boolean tf = true;
while(tf){
int sum = 0;
for(int i=0 ; i<num.length(); i++){
sum += (int)Math.pow(num.charAt(i) - '0',2);
}
if(sum == 1){
return true;
}else{
tf = unHappySet.add(sum);
}
num = sum + "";
}
return false;
}
}
통과는 했지만 속도도 꽝이고
String 변수가 계속 선언되어서 그런지 메모리도 엄청 잡아먹었다.
😃 || 코드 배우기

빠르게 실행되는 결과를 보니 예시를 하나 볼 수 있었다.
import java.util.*;
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
while(!set.contains(n)) {
set.add(n);
int temp = n;
n = 0;
while(temp != 0) {
n += (temp % 10) * (temp % 10);
temp /= 10;
}
if(n == 1)
return true;
}
return false;
}
}
내가 풀었던 방식은 각 자리수의 값을 charAt메서드를 이용해서 가져온 후 제곱해주는 것이었는데
여기서는 10으로 나눠서 나온 나머지 , 즉 끝자리의 값을 제곱해서 더해주고
다시 10으로 나누어서 자리수를 줄여주고 하는 식으로 각 자리의 값을 가져오도록 만들었다.
이렇게 하니 확실히 속도가 확연히 줄어들었다..
각 자리수를 구하게 된다면 % 와 / 연산자를 잘 활용할 것!
'Algorithm' 카테고리의 다른 글
LeetCode :: Valid Anagram (Java) (0) | 2021.04.30 |
---|---|
프로그래머스 :: 같은 숫자는 싫어 (Java) 알고리즘 풀이 (0) | 2021.04.26 |
프로그래머스 :: 이상한 문자 만들기 (Java) 알고리즘 /split (String regex, int limit) 정리 (0) | 2021.04.24 |
프로그래머스 :: 카펫 (Java) 알고리즘 (0) | 2021.02.28 |
프로그래머스 :: 3진법 뒤집기 (Java) (0) | 2021.02.21 |
reply