πŸ•οΈ ICPC Sinchon/Basic Math

[BOJ][C++] λ°±μ€€ 9421번: μ†Œμˆ˜μƒκ·Όμˆ˜

선달 2023. 6. 2. 23:35
λ°˜μ‘ν˜•

https://www.acmicpc.net/problem/9421

 

9421번: μ†Œμˆ˜μƒκ·Όμˆ˜

μ–‘μ˜ μ •μˆ˜ n의 각 자리수의 제곱의 합을 κ³„μ‚°ν•œλ‹€. κ·Έλ ‡κ²Œ ν•΄μ„œ λ‚˜μ˜¨ 합도 각 자리수의 제곱의 합을 κ³„μ‚°ν•œλ‹€. μ΄λ ‡κ²Œ λ°˜λ³΅ν•΄μ„œ 1이 λ‚˜μ˜¨λ‹€λ©΄, n을 μƒκ·Όμˆ˜λΌκ³  ν•œλ‹€. 700은 μƒκ·Όμˆ˜μ΄λ‹€. 72 + 02 + 02 =

www.acmicpc.net

 

문제

μ–‘μ˜ μ •μˆ˜ n의 각 자리수의 제곱의 합을 κ³„μ‚°ν•œλ‹€. κ·Έλ ‡κ²Œ ν•΄μ„œ λ‚˜μ˜¨ 합도 각 자리수의 제곱의 합을 κ³„μ‚°ν•œλ‹€. μ΄λ ‡κ²Œ λ°˜λ³΅ν•΄μ„œ 1이 λ‚˜μ˜¨λ‹€λ©΄, n을 μƒκ·Όμˆ˜λΌκ³  ν•œλ‹€.

700은 μƒκ·Όμˆ˜μ΄λ‹€.

  • 72 + 02 + 02 = 49
  • 42 + 92 = 97
  • 92 + 72 = 130
  • 12 + 32 + 02 = 10
  • 12 + 02 = 1

2λŠ” μƒκ·Όμˆ˜κ°€ μ•„λ‹ˆλ‹€.

  • 22 = 4
  • 42 = 16
  • 12 + 62 = 37
  • 32 + 72 = 58
  • 52 + 82 = 89
  • 82 + 92 = 145
  • 12 + 42 + 52 = 42
  • 42 + 22 = 20
  • 22 + 02 = 4
  • 42 = 16
  • ... λλ‚˜μ§€ μ•ŠλŠ”λ‹€

μ†Œμˆ˜λŠ” 1κ³Ό μžκΈ°μžμ‹ μ„ μ œμ™Έν•˜κ³  μ•½μˆ˜κ°€ μ—†λŠ” μˆ˜μ΄λ‹€. 2, 3, 5, 7, 11, 13, 17, 19, ... λŠ” μ†Œμˆ˜μ΄λ‹€.

μ†Œμˆ˜μƒκ·Όμˆ˜λŠ” μ†Œμˆ˜μ΄λ©΄μ„œ μƒκ·Όμˆ˜μΈ μˆ«μžμ΄λ‹€. 7, 13, 19, ... λŠ” μ†Œμˆ˜ μƒκ·Όμˆ˜μ΄λ‹€.

n이 μ£Όμ–΄μ‘Œμ„ λ•Œ, n보닀 μž‘κ±°λ‚˜ 같은 λͺ¨λ“  μ†Œμˆ˜μƒκ·Όμˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 n (10 ≤ n ≤ 1000000)이 주어진닀.

 

풀이

nκΉŒμ§€μ˜ λͺ¨λ“  μˆ˜λ“€μ΄ true인 배열을 ν•˜λ‚˜ λ§Œλ“ λ‹€.

μ—λΌν† μŠ€ν…Œλ„€μŠ€λ‘œ μ†Œμˆ˜κ°€ μ•„λ‹Œ 애듀을 false둜 κ±ΈλŸ¬λ‚Έλ‹€

λ¬Έμ œμ— λ‚˜μ˜¨ κ·ΈλŒ€λ‘œ κ΅¬ν˜„ν•΄μ„œ μƒκ·Όμˆ˜κ°€ μ•„λ‹Œ κ²½μš°λ„ false둜 κ±ΈλŸ¬λ‚Έλ‹€

 

μƒκ·Όμˆ˜ νŒλ³„ :

각 자리 숫자의 μ œκ³±μ„ λ”ν•œ 값듀을 μ—°μ†μ μœΌλ‘œ κ΅¬ν•˜λ©΄μ„œ ν•œλ²ˆμ΄λΌλ„ κ΅¬ν–ˆλ˜ 값이 λ‚˜μ˜€λ©΄ μ§€κΈˆκΉŒμ§€ λ‚˜μ™”λ˜ 값듀은 μ „λΆ€ falseμ²˜λ¦¬ν•œλ‹€

(μ–΄μ°¨ν”Ό μˆœν™˜ν• κ²Œ λ»”ν•˜κΈ° λ•Œλ¬Έ)

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

const int INF = 1000001;

vector<bool> isSoSang(INF, true);

// 각 자리 숫자 제곱 λ”ν•˜λŠ” ν•¨μˆ˜
int sumOfDigit(int num) {
    int sum = 0;
    while(num>0) {
        sum += (num%10)*(num%10);
        num/=10;
    }
    return sum;
}

int main() {
    int n;
    cin >> n;
    
    // μ†Œμˆ˜ νŒλ³„
    isSoSang[0] = isSoSang[1] = false;
    for(int i=2; i<=sqrt(n); i++) {
        if(!isSoSang[i])
            continue;
        for(int j=i*i; j<=n; j+=i)
            isSoSang[j] = false;
    }
    
    // μ†Œμˆ˜μƒκ·Όμˆ˜ νŒλ³„
    for(int i=2; i<=n; i++) {
        if(!isSoSang[i]) // μ†Œμˆ˜ μ•„λ‹ˆλ©΄ μ‚΄νŽ΄λ³Ό ν•„μš”λ„ 없이 λ„˜μ–΄κ°„λ‹€
            continue;
        int tmp = i;
        vector<int> history;
        while(true) {
            if(tmp == 1) {
                // μ•—! 1이 λ‚˜μ™”λ‹€!
                break;
            }
            if(count(history.begin(), history.end(), tmp) != 0) { 
                // μ•—! μˆœν™˜μ΄ λ°œκ²¬λ˜μ—ˆλ‹€!
                for(int j : history) // λ‚˜μ™”λ˜ μ• λ“€ μ „λΆ€ μƒκ·Όμˆ˜ μ œμ™Έ
                    isSoSang[j] = false;
                break;
            }
            history.push_back(tmp);
            tmp = sumOfDigit(tmp);
        }
    }
    
    // 좜λ ₯
    for(int i=2; i<=n; i++) {
        if(isSoSang[i])
            cout << i << "\n";
    }
    
    return 0;
}
λ°˜μ‘ν˜•