[Step-6] 백준 4673번 셀프넘버

작성일     업데이트:

카테고리:

태그:

내 풀이

-> boolean 배열을 생성한다
-> 1~10000까지 for문을 돌린다
-> i 를 String으로 변환하고 다시 char형태로 쪼개어 배열에 담는다
-> char배열 안의 데이터를 - '0'를 이용하여 숫자로 변환 후 모두 더하고 거기에 본래 숫자 i 값도 더한다
-> 위에서 나온 숫자에 해당하는 boolean 배열 위치에 true값을 넣는다
-> boolean[i] 의 값을 꺼내 만약 false라면 출력한다

[코드보기]
public class Main {
  public static void main(String[] args) {
    boolean[] bool = new boolean[10001];
    for(int i =1; i<=10000; i++) {
      char[] c = Integer.toString(i).toCharArray();
      int answer = 0;

      for(char chr : c) {
        int num  = chr - '0';
        answer += num;
      }
      answer += i;

      if(answer <=10000) {
        bool[answer] = true;
      }

      if(!bool[i]) {
        System.out.println(i);
      }
    }
  }
}


처음엔 boolean배열을 생성해두고 각 위치마다 값을 넣지 않으면 그곳엔 null값이 들어가있지 않을까 해서

boolean bool[] = new boolean[10001];
Arrays.fill(bool,true);

이런식으로 아예 전체 초기화를 시켜버렸었는데 여러모로 실험해보니 이럴 필요가 없었다.
boolean배열은 생성만 해두었을경우 기본적으로 다 false로 셋팅되어 생성되는 모양인지 따로 값을 지정하지 않은 곳을 불러와도 NullPointerException이 발생하지 않고 false값을 반환했다.
따라서 Arrays.fill(bool,true); 이 코드는 말 그대로 boolean배열을 사용하다 값들을 초기화하고 싶을때 사용하면 될 것 같다. (다만 사용하려면 import java.util.Arrays; 가 필요)


다른사람의 풀이

나는 위 문제를 int -> Sting -> char -> int 식으로 여러번 형변환을 해가며 풀어냈었다.
하지만 이렇게 형변환 없이도 while문으로 바로 원하는 값을 구해낸 코드를 발견했다.

public static int d(int number){
  int sum = number;

  while(number != 0){
    sum = sum + (number % 10); // 첫 째 자리수
    number = number/10;	// 10을 나누어 첫 째 자리를 없앤다
  }

  return sum;
}

이런식으로 while을 돌며 %로 각 자리수를 구하는 방식이다.

BaekJoon 카테고리 내 다른 글 보러가기

댓글남기기