λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/BOJ

[BOJ] ν–‰λ³΅ν•œ μ†Œμˆ˜(10434)

[λ°±μ€€(BOJ)] ν–‰λ³΅ν•œ μ†Œμˆ˜(10434) C++

문제 : BOJ_10434번 ν–‰λ³΅ν•œ μ†Œμˆ˜

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

문제 제λͺ©κ³ΌλŠ” 달리 μ‚¬λžŒ μ°Έ λΆˆν–‰ν•˜κ²Œ λ§Œλ“œλŠ” μ†Œμˆ˜μž…λ‹ˆλ‹€...
이 λ¬Έμ œμ—μ„œλŠ” μ–΄λ–€ 수λ₯Ό μ£Όμ—ˆμ„ λ•Œ, 두 가지 쑰건을 λ§Œμ‘±ν•˜λŠ”κ°€λ₯Ό νƒμƒ‰ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

  • μ–΄λ–€ μˆ˜κ°€ ν–‰λ³΅ν•œ 수 인가? - ν–‰λ³΅ν•œ μˆ˜λŠ” 주어진 수의 각 자릿수의 μ œκ³±μ„ κ³±ν•΄μ„œ 더 ν•΄μ£Όκ³  λ‚˜μ˜¨ 수λ₯Ό 또 각 자릿수의 μ œκ³±μ„ κ³±ν•΄μ£ΌλŠ” 방법을 λ°˜λ³΅ν•΄μ„œ 1이 될 수 μžˆλŠ” 수λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • μ–΄λ–€ μˆ˜κ°€ μ†Œμˆ˜μΈκ°€? - μ—¬κΈ°μ„œ μ†Œμˆ˜ νŒλ³„μ„ μˆ˜λ§ˆλ‹€ ν•΄μ€˜μ•Ό ν•˜λŠ”λ°, ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ μ΅œλŒ€μˆ˜λŠ” 1000, 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ μ΅œλŒ€ λ²ˆν˜ΈλŠ” 10000이기 λ•Œλ¬Έμ— μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μ‹œκ°„ μ΄ˆκ³Όκ°€ 되고 λ§™λ‹ˆλ‹€
  • (μ—λΌν† μŠ€ν…Œλ„€μŠ€μ— λŒ€ν•œ μžμ„Έν•œ μ„€λͺ…은 이 λΈ”λ‘œκ·Έμ˜ μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄μ—μ„œ λ‹€λ€˜μŠ΅λ‹ˆλ‹€.)

μœ„ 두 쑰건을 λ§Œμ‘±ν•œλ‹€λ©΄ κ·Έ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ λ²ˆν˜ΈλŠ” ν–‰λ³΅ν•œ μ†Œμˆ˜λ₯Ό λ§Œμ‘±ν•΄μ„œ YESκ°€ 좜λ ₯되고 μ•„λ‹ˆλ©΄ NOκ°€ 좜λ ₯λ©λ‹ˆλ‹€.

문제의 쑰건

(2) 번 쑰건은 μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•΄ μ†Œμˆ˜μΈμ§€ μ•„λ‹Œμ§€ νŒλ³„ν•΄μ•Ό 되고,
(1) 번 쑰건 같은 κ²½μš°μ—”, 주어진 수λ₯Ό 자릿수의 제곱의 ν•©λ“€λ‘œ 계속 λ°”κΏ”λ³΄λ©΄μ„œ
색을 ν•΄μ•Ό λ©λ‹ˆλ‹€. μ΄λ•Œ, 1이 되기 전에 각 자릿수의 μ œκ³±λ“€μ˜ 합이 μ›λž˜ 수둜
λ°˜λ³΅λ˜μ–΄μ„œ λ‚˜νƒ€λ‚œλ‹€λ©΄ 1이 λ˜μ§€ μ•Šκ³  계속 λ°˜λ³΅ν•œλ‹€λŠ” μ˜λ―Έμ΄λ―€λ‘œ,
(1)의 쑰건을 만쑱 λͺ» ν•˜λŠ” 것이고 그전에 1이 λœλ‹€λ©΄ (1)의 쑰건을 λ§Œμ‘±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

  1. (1)의 쑰건을 만쑱 λͺ» ν•˜κ³  λ°˜λ³΅λ˜λŠ” 경우λ₯Ό ν™•μΈν•˜λŠ” 것은 배열을 톡해 확인 (dis_arr[]);
  2. sqrt()λ₯Ό μ¨μ„œ μ΅œλŒ€ν•œ 적은 횟수둜 μ†Œμˆ˜ νŒλ³„ (cmath)
  3. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μ•žμ— ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ λ²ˆν˜Έκ°€ μžˆλŠ”λ° κ·Έ λ²ˆν˜Έμ™€ 상관없이 μž…λ ₯ν•œ 수 μˆœμ„œλŒ€λ‘œ κ·ΈλŒ€λ‘œ 좜λ ₯ν•΄μ•Ό 됨!!! (ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μ•ž 번호λ₯Ό μˆœμ„œλ‘œ μˆœμ„œλŒ€λ‘œ ν•œκΊΌλ²ˆμ— 좜λ ₯ν•˜λ©΄ μ˜€λ‹΅ 처리)

C++ μ†ŒμŠ€

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int era[10010], dis_arr[10010], roof; // dis_arr == μ›λž˜μ˜ 수둜 λ°˜λ³΅λ˜λŠ”μ§€ 확인해보기 μœ„ν•΄ λ§Œλ“  λ°°μ—΄
int happy(int x);
int main(void) {
    era[0] = 1;
    era[1] = 1;
    for (int i = 2; i < sqrt(10000); i++) { // μ΅œλŒ€ν•œ μ‹œκ°„μ„ 쀄이기 μœ„ν•œ sqrt()
        if (era[i] == 1) continue;
        int cnt = 2;
        while (cnt*i <= 10000) {
            era[i*cnt] = 1;
            cnt++;
        }
    }
    cin >> roof;
    for (int i = 1; i <= roof; i++) {
        int a, b;
        cin >> a >> b;
        if (happy(b) == 1) {
            if (era[b] == 0) {
                cout << a << ' ' << b << ' ' << "YES" << '\n';
            }
            else cout << a << ' ' << b << ' ' << "NO" << '\n';
        }
        else cout << a << ' ' << b << ' ' << "NO" << '\n';
        memset(dis_arr, 0, sizeof(dis_arr));
    }
    return 0;
}
int happy(int x) { // 1을 return ν•˜λ©΄ ν–‰λ³΅ν•œ 수 , 0을 return ν•˜λ©΄ ν–‰λ³΅ν•œ μˆ˜κ°€ μ•„λ‹ˆλ‹€.
    while (1) {
        if (x == 1) return 1;
        if (x == 10000) return 1;
        else if (x >= 1000 && x < 10000) {
            x = (x / 1000)*(x / 1000) + ((x / 100) % 10)*((x / 100) % 10) + ((x / 10) % 10)*((x / 10) % 10) + (x % 10)*(x % 10);
            if (dis_arr[x] == 1) return 0;
            else dis_arr[x] = 1;
            continue;
        }
        if (x >= 100 && x < 1000) {
            x = (x / 100)*(x / 100) + ((x / 10) % 10)*((x / 10) % 10) + (x % 10)*(x % 10);
            if (dis_arr[x] == 1) return 0;
            else dis_arr[x] = 1;
            continue;
        }
        else if (x >= 10 && x < 100) {
            x = (x / 10)*(x / 10) + (x % 10)*(x % 10);
            if (dis_arr[x] == 1) return 0;
            else dis_arr[x] = 1;
            continue;
        }
        else if (x > 1 && x < 10) {
            x = x * x;
            if (dis_arr[x] == 1) return 0;
            else dis_arr[x] = 1;
            continue;
        }
    }
}

'Algorithm > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] ACM Craft(1005)  (0) 2022.03.05
[BOJ] 이λͺ¨ν‹°μ½˜(14226)  (0) 2022.03.05
[BOJ] μƒˆλΌμΉ˜κΈ°(17291)  (0) 2022.03.05
[BOJ] λ¬Έμ œμ§‘(1776)  (0) 2022.03.05
[BOJ] μ–‘ ꡬ좜 μž‘μ „(16437)  (0) 2022.03.05