하루 1문제 챌린지/Gold5

백준 203202번 민트초코(C++) 🚩

그린푸딩 2024. 2. 17. 20:58
728x90
반응형

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

 

20302번: 민트 초코

상원이가 고른 디저트가 “민트 초코”인 경우 mint chocolate, “치약”인 경우 toothpaste를 출력한다.

www.acmicpc.net

틀렸습니다

int 값만 빼면 정수인지 판별되지 않을까? 했는데 통과 안됨 왜일까

#include <iostream>
#include<vector>

using namespace std;

int main()
{
    int n;
    cin>>n;
    float p;
    char c;
    cin>>p;
    
    float sum=p;
    
    for(int i=0;i<n-1;i++){
       cin>>c>>p;
       
       if(c=='*'){
           sum*=(double)p;
       }
       if(c=='/'){
           sum/=(double)p;
       }
    }
    if((abs(sum)-(int)abs(sum))>0){
        cout<<"toothpaste";
    }
    else cout<<"mint chocolate";
    

    return 0;
}

 

 

무수한 틀렸습니다

 

정답 

 

- 피연산자가 0이 나왔는데 뒤의 연산에서 계속 각 소수 소인수의 갯수를 세면 안된다. 

- 백준 16563번 "어려운 소인수분해" 문제 기반 풀음

- 에라토스테네체 복습 : n으로 나누어떨어지는 최대 숫자-  i*i<=n 을, 그다음 루프에서는 앞에서 다 뺐으므로 j=i*i부터 

- 최근에 푼 문제 중 가장 어려웠던 문제, chocolate 철자 잘못써서 무수한 틀렸습니다가 나옴 

#include <iostream>
#include<vector>
#include<map>

using namespace std;

vector<int>prime;


//소수로 구성된 지수를 모두 계산해서 최종값에서 지수가 음수인지 확인

int main()
{
  int n;
  cin>>n;
  prime.assign(100001,0);
  
  for(int i=2;i<=100000;i++){
      prime[i]=i;
  }
  
  //소인수분해를 위한 소수 저장 
  //각 자리에는 나누어질수 있는 가장 작은 소수가 담겨있어서 쭉 탐색하면됨 
  for(int i=2;i*i<=100000;i++){
      if(prime[i]==i){
          for(int j=i*i;j<=100000;j+=i){
              if(prime[j]==j)prime[j]=i; 
          }
      }
  }
  
  
  int p;
  char c;
  cin>>p;
  //음수 -> 양수 
  
  if(p==0){
          cout<<"mint chocolate";
          return 0;
  }
      
  map<int,int>m;
  //현재 소인수분해 구하기 
  p=abs(p);
  while(p>1){
      
      m[prime[p]]++;
      p/=prime[p];
  }
  
  for(int i=0;i<n-1;i++){
      cin>>c>>p;
      p=abs(p);
      //0예외처리 - 0이 입력되었는데 뒤에 소인수 갯수 카운트해주면 안됨 
      if(p==0){
          cout<<"mint chocolate";
          return 0;
      }
      
      if(c=='*'){
          //지수 더해주기 
          while(p>1){
              m[prime[p]]++;
              p/=prime[p];
          }
          
      }
      if(c=='/'){
          //지수 빼주기 
          while(p>1){
              
              m[prime[p]]--;
              p/=prime[p];
          }
      }
  }
  
  //지수가 음수인게 있으면 정수아님
  for(auto it :m){
    //  cout<<it.first<<' '<<it.second<<'\n';
      if(it.second<0){
          cout<<"toothpaste";
          return 0;
                  
      }
  }
  
  cout<<"mint chocolate";
  
   
   
   

    return 0;
}
728x90
반응형