[leetcode 202] Happy Number

202. Happy Number

https://leetcode.com/problems/happy-number/

해결 과정

반복이 되는 작업을 생각해보았다.

  • 주어진 숫자를 쪼갠다 -> 제곱해서 더한다 -> 더한 값이 1인지 검사

반복이 사용되기 때문에 탈출조건 도 생각한다.

  • 입력 값이 1일때, 그리고 같은 입력이 또 들어왔을때

코드

fun isHappy(n: Int): Boolean {
  if(n==1) return true

  var input = n
  val tested = HashSet<Int>()
  while(tested.add(input)) {
    var tempSum = 0
    var num = 0

    while (input > 0) {
      num = input % 10
      tempSum += num * num
      input /= 10
    }

    if (tempSum == 1)
      return true
    else 
      input = tempSum
  }
  return false
}

배운 점

  1. 같은 값이 또 들어왔는지를 검사할 땐 HashSet 을 사용하면 된다.
  • HashSet의 add(E e) 메소드는 입력 e 를 이미 가지고 있을 때 false를 반환
  1. Int 값을 쪼개서 다루고 싶을 때는 % 연산자를 사용한다.
  • 항상 더 효율적인 방법은 없을지 생각하자.

습관적으로 Int 값을 쪼개서 다루어야할 때 (ex. 15라면, 1과 5) charArray로 변경하여 사용했었는데, 공간/연산 비용면에서 효율적이지 않았다.

아래와 같은 방법으로 각 자리수를 사용할 수 있다.

while (n > 0) {
  num = n % 10
  // TODO
  n /= 10
}

Leave a comment