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
반응형
'하루 1문제 챌린지 > Gold5' 카테고리의 다른 글
백준 10282번 해킹 (다익스트라,C++) (1) | 2024.06.17 |
---|---|
백준 1043번 거짓말(C++)🚩 (1) | 2024.02.27 |
백준 16562번 친구비(C++) 🚩 (0) | 2024.02.27 |
백준 17485 진우의 달여행(large) C++ 🚩 (1) | 2024.01.31 |
백준 14719번 빗물 (C++) 🚩 (0) | 2024.01.22 |