πŸ₯ˆ [Baekjoon / Java] 4673. μ…€ν”„ λ„˜λ²„

μ΄ν•˜μ–€Β·2024λ…„ 4μ›” 15일
0

🐣 λ°±μ€€

λͺ©λ‘ 보기
11/33

πŸ’‘ Info



πŸ’­ 문제 이해

  • n을 d(n)의 μƒμ„±μžλΌκ³  ν•  λ•Œ, μƒμ„±μžκ°€ μ—†λŠ” 숫자인 μ…€ν”„ λ„˜λ²„λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯

πŸ“₯μž…λ ₯ 쑰건

  • μž…λ ₯은 μ—†λ‹€.

πŸ“€μΆœλ ₯ 쑰건

  • 10,000보닀 μž‘κ±°λ‚˜ 같은 μ…€ν”„ λ„˜λ²„λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© μ¦κ°€ν•˜λŠ” μˆœμ„œλ‘œ 좜λ ₯ν•œλ‹€.
    • 좜λ ₯ μ˜ˆμ‹œ 1
      1
      3
      5
      7
      9
      20
      31
      42
      53
      64
       |
       |       <-- a lot more numbers
       |
      9903
      9914
      9925
      9927
      9938
      9949
      9960
      9971
      9982
      9993


πŸ’­ μƒκ°ν•œ μ•Œκ³ λ¦¬μ¦˜

μ‹€μ œ 풀이 μ‹œκ°„ : 27λΆ„

  • 1,000κΉŒμ§€μ˜ μ…€ν”„ λ„˜λ²„ 좜λ ₯ν•˜κΈ°
  • λ„˜λ²„ + μ‹­μ˜ 자리 + 일의 자리 = μˆ˜μ—΄( d(n) = n + n의 천(λ―Έμ •)의 자리 +...+ n의 일의 자리)
    • 계산법 : n을 10으둜 계속 λ‚˜λˆ„μ–΄ μ΅œμ’… 일의 μžλ¦¬κ°€ 될 λ•ŒκΉŒμ§€ λ‚˜λˆˆλ‹€μŒ, 기쑴의 sum에 계속 λ”ν•˜κΈ°
public class Main {
    static int n;
    static int[] selfNum = new int[10001];

    public static void main(String[] args){
        for(int i=1; i<10001; i++){
            n = d(i);
            if(selfNum[i] != d(i)) {
                System.out.println(i);
            }
        }
    }

    public static int d(int num){
        int sum = num; // 1. sum을 num으둜 μ΄ˆκΈ°ν™”ν•˜κΈ°
        while(num!=0){ // 2. 각 자리수λ₯Ό λ”ν•˜κΈ° μœ„ν•œ 반볡문 μž‘μ„±
            sum = sum + (num % 10); // 3. num의 첫번째 자리 수λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ %10을 ν•œ λ‹€μŒ sum에 λ”ν•˜κΈ°
            num = num / 10; // 4. κ·Έ 이후 /10을 진행해 10을 쀄이기
        }
        return sum; // 5. 좜λ ₯이 되면 "μ•ˆλ˜λŠ”" 값이 리턴!(즉, κ²°κ³Όμ—μ„œλŠ” λ’€μ§‘μ–΄μ€˜μ•Ό ν•œλ‹€λŠ” 것)
    }
}


❌ μ˜€λ‹΅μ²΄ν¬

  • μ…€ν”„ λ„˜λ²„λ§Œμ΄ μ•„λ‹Œ, λͺ¨λ“  λ²”μœ„μ˜ μˆ«μžκ°€ λ‹€ 좜λ ₯λ˜μ–΄ λ°±μ€€μ—μ„œ 좜λ ₯ 초과 λ°œμƒ

    • selfNum 배열을 Boolean으둜 λ°”κΎΈμ–΄ μ…€ν”„ λ„˜λ²„κ°€ λ§žλŠ”μ§€ μ—¬λΆ€λ₯Ό νŒŒμ•…ν•˜λ„λ‘ μˆ˜μ •ν•˜κΈ°
    • μ…€ν”„ λ„˜λ²„λ₯Ό κ΅¬λΆ„ν•˜λŠ” forλ¬Έκ³Ό 좜λ ₯ν•˜λŠ” for문을 λ‚˜λˆ„μ–΄ μž‘μ„±ν•˜κΈ°
     //μ…€ν”„ λ„˜λ²„
          for(int i=1; i<10001; i++) {
              n = d(i);
              if (n < 10001) {
                  selfNum[n] = true; //λ¦¬ν„΄λ˜λŠ” μˆ˜λŠ” μƒμ„±μžκ°€ μžˆλŠ” 수(좜λ ₯ X)이기 λ•Œλ¬Έ
              }
          }
    
          //μ…€ν”„ λ„˜λ²„ 좜λ ₯
          for(int i=1; i<10001; i++) {
              if(!selfNum[i]) {
                  System.out.println(i);
              }
          }


πŸ’­ μ΅œμ’… 풀이

  • 1,000κΉŒμ§€μ˜ μ…€ν”„ λ„˜λ²„ 좜λ ₯ν•˜κΈ°
  • λ„˜λ²„ + μ‹­μ˜ 자리 + 일의 자리 = μˆ˜μ—΄( d(n) = n + n의 천(λ―Έμ •)의 자리 +...+ n의 일의 자리)
    • 계산법 : n을 10으둜 계속 λ‚˜λˆ„μ–΄ μ΅œμ’… 일의 μžλ¦¬κ°€ 될 λ•ŒκΉŒμ§€ λ‚˜λˆˆλ‹€μŒ, 기쑴의 sum에 계속 λ”ν•˜κΈ°
        1. sum을 num으둜 μ΄ˆκΈ°ν™”ν•˜κΈ°
        1. 각 자리수λ₯Ό λ”ν•˜κΈ° μœ„ν•œ 반볡문 μž‘μ„±
        1. num의 첫번째 자리 수λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ %10을 ν•œ λ‹€μŒ sum에 λ”ν•˜κΈ°
        1. κ·Έ 이후 /10을 진행해 10을 쀄이기
        1. 좜λ ₯이 되면 "μ•ˆλ˜λŠ”" 값이 리턴!(즉, κ²°κ³Όμ—μ„œλŠ” λ’€μ§‘μ–΄μ€˜μ•Ό ν•œλ‹€λŠ” 것)
public class Main {
    static int n;
    static boolean[] selfNum = new boolean[10001];

    public static void main(String[] args){
        //μ…€ν”„ λ„˜λ²„
        for(int i=1; i<10001; i++) {
            n = d(i);
            if (n < 10001) {
                selfNum[n] = true; //λ¦¬ν„΄λ˜λŠ” μˆ˜λŠ” μƒμ„±μžκ°€ μžˆλŠ” 수(좜λ ₯ X)이기 λ•Œλ¬Έ
            }
        }

        //μ…€ν”„ λ„˜λ²„ 좜λ ₯
        for(int i=1; i<10001; i++) {
            if(!selfNum[i]) {
                System.out.println(i);
            }
        }
    }

    public static int d(int num){
        int sum = num; // 1. sum을 num으둜 μ΄ˆκΈ°ν™”ν•˜κΈ°
        while(num!=0){ // 2. 각 자리수λ₯Ό λ”ν•˜κΈ° μœ„ν•œ 반볡문 μž‘μ„±
            sum = sum + (num % 10); // 3. num의 첫번째 자리 수λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ %10을 ν•œ λ‹€μŒ sum에 λ”ν•˜κΈ°
            num = num / 10; // 4. κ·Έ 이후 /10을 진행해 10을 쀄이기
        }
        return sum; // 5. 좜λ ₯이 되면 "μ•ˆλ˜λŠ”" 값이 리턴!(즉, κ²°κ³Όμ—μ„œλŠ” λ’€μ§‘μ–΄μ€˜μ•Ό ν•œλ‹€λŠ” 것)
    }
}

profile
μ–Έμ  κ°€ λ‚΄ μ½”λ“œλ‘œ 세상에 κΈ°μ—¬ν•  수 μžˆλ„λ‘, BE 개발 기둝 λ…ΈνŠΈβ˜˜οΈ

0개의 λŒ“κΈ€