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

Algorithm/BaekJoon

[20302] λ―ΌνŠΈμ΄ˆμ½”

728x90

πŸ™ƒ : λŒ€μΆ© λ‹€μ‹œ μ‹œλ„ν•΄μ•Όν•œλ‹€λŠ” 뜻 

 

λΆ„λ₯˜

  • μˆ˜ν•™
  • μ •μˆ˜λ‘ 
  • μ†Œμˆ˜ νŒμ •
  • μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

 

문제

 

 

풀이

μž…λ ₯으둜 받은 수의 μ ˆλŒ“κ°’μ„ μ „λΆ€ μ†ŒμΈμˆ˜ λΆ„ν•΄ν•˜μ—¬,

  • * 이면, μ†ŒμΈμˆ˜ λΆ„ν•΄λ˜λŠ” μ†ŒμΈμˆ˜μ˜ μ§€μˆ˜λ₯Ό +1 
  • / 이면, μ†ŒμΈμˆ˜ λΆ„ν•΄λ˜λŠ” μ†ŒμΈμˆ˜μ˜ μ§€μˆ˜λ₯Ό -1 

μ§€μˆ˜κ°€ 음수인 μ†ŒμΈμˆ˜κ°€ ν•˜λ‚˜λΌλ„ μ‘΄μž¬ν•˜λ©΄ 유리수 

 

주의)

0이 κ³±ν•΄μ§€λŠ” μˆœκ°„ λ°”λ‘œ μ •μˆ˜

λΆ€ν˜ΈλŠ” 상관 μ—†μŒ

 

 

μ½”λ“œ

//
// 민트 μ΄ˆμ½”
//

/*
 * μž…λ ₯으둜 받은 수의 μ ˆλŒ“κ°’μ„ μ „λΆ€ μ†ŒμΈμˆ˜ λΆ„ν•΄ν•˜μ—¬,
    * 이면, μ†ŒμΈμˆ˜ λΆ„ν•΄λ˜λŠ” μ†ŒμΈμˆ˜μ˜ μ§€μˆ˜λ₯Ό +1
    / 이면, μ†ŒμΈμˆ˜ λΆ„ν•΄λ˜λŠ” μ†ŒμΈμˆ˜μ˜ μ§€μˆ˜λ₯Ό -1
 * μ§€μˆ˜κ°€ 음수인 μ†ŒμΈμˆ˜κ°€ ν•˜λ‚˜λΌλ„ μ‘΄μž¬ν•˜λ©΄ 유리수
 *
 *
 */

#include <iostream>
#include <vector>

using namespace std;

const int SIZE = 100000;//μž…λ ₯λ²”μœ„ -100000 ~ +100000 (μ ˆλŒ“κ°’μœΌλ‘œ ν•  κ±°λΌμ„œ μ–‘μˆ˜)

vector<int> prime(SIZE + 1, 0);//μ†ŒμΈμˆ˜λΆ„ν•΄ν‘œ(?)
vector<int> exponent(SIZE + 1, 0); //각 μ†Œμˆ˜μ˜ μ§€μˆ˜λ₯Ό μ €μž₯

void isPrime() {

    //μ•„λ ˆμŠ€ν† ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ‘μš©ν•΄ μ†ŒμΈμˆ˜ λΆ„ν•΄ ν‘œ λ§Œλ“€κΈ°


    //λͺ¨λ“  μˆ˜κ°€ μ†Œμˆ˜λΌκ³  κ°€μ •ν•˜κ³ , ν•΄λ‹Ή μΉΈμ•ˆμ— μžκΈ°μžμ‹ μ„ μ €μž₯
    for (int i = 2; i <= SIZE; i++) {
        prime[i] = i;
    }

    for (int i = 2; i * i < SIZE; i++) {
        if (prime[i] == i) { // ν•΄λ‹Ή 수(i)에가 μ†Œμˆ˜μΌ κ²½μš°μ—
            for (int j = i * i; j <= SIZE; j += i) { //ν•΄λ‹Ή 수(i)의 λ°°μˆ˜λ“€μ€ i둜 μ•½λΆ„κ°€λŠ₯ -> iλŒ€μž…
                if (prime[j] == j) //λ³„λ„λ‘œ μ§€μ •λœ μ†Œμˆ˜κ°€ 없을 경우
                    prime[j] = i; // iλŠ” j의 μ†ŒμΈμˆ˜μ€‘ μ΅œμ†Œ -> μ™œ μ΅œμ†ŒμΈμ§€λŠ” μ†ŒμΈμˆ˜ λΆ„ν•΄μ—μ„œ
            }
        }
    }

}

//μ†ŒμΈμˆ˜ λΆ„ν•΄ ν‘œ κ°±μ‹ 
void countExponent(int a, char c) {

    int cnt;
    if (c == '*') cnt = 1; // *λ©΄ ++
    else cnt = -1;// / 이면 --

    while (a > 1) {
        exponent[prime[a]] += cnt; //μ†ŒμΈμˆ˜ λΆ„ν•΄ν•˜μ—¬ exponentμΉΈ κ°±μ‹ 
        a = a / prime[a]; //μ΅œμ†Œ μ†ŒμΈμˆ˜λ‘œ λ‚˜λˆ„μ–΄ λ‹€λ₯Έ μ†ŒμΈμˆ˜λ“€μ˜ 값도 ꡬ해주어야함
    }

}

//연산이 λλ‚œ ν›„, μ†ŒμΈμˆ˜μ˜ μ§€μˆ˜μ— 음수 μžˆλŠ”μ§€ νŒλ‹¨ -> μžˆλ‹€λ©΄ 유리수 -> true 리턴
bool isRationalNumber() {
    for (int i = 2; i <= SIZE; i++) {
        if (exponent[i] < 0) //유리수라면
            return true;
    }
    return false;//μ •μˆ˜
}


int main() {

    int N;
    cin >> N;

    int num;
    char op;

    isPrime();

    //맨 처음 μˆ˜λŠ” μ—°μ‚°μžκ°€ μ—†μ–΄μ„œ '*'둜 λ„£μ–΄μ€Œ
    cin >> num;
    if (num == 0) {
        cout << "mint chocolate" << "\n";
        return 0;
    }

    countExponent(num, '*');
    N--;

    while (N--) {

        cin >> op >> num;

        if (num == 0) {
            cout << "mint chocolate" << "\n";
            return 0;
        }

        // λΆ€ν˜ΈλŠ” μƒκ΄€μ—†μŒ 
        countExponent(abs(num), op);

    }


    if (isRationalNumber())
        cout << "toothpaste" << "\n";
    else
        cout << "mint chocolate" << "\n";

    return 0;

}

 

728x90

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

[2529] λΆ€λ“±ν˜Έ  (0) 2021.10.09
[20055] 컨베이어 벨트 μœ„μ˜ λ‘œλ΄‡  (0) 2021.09.28
[2841] μ™Έκ³„μΈμ˜ 기타 μ—°μ£Ό  (0) 2021.09.27
[2493] 탑  (0) 2021.09.24
[11723] 집합  (0) 2021.09.23