1-K 관련 질문 드립니다!
안녕하세요 큰돌님!
다름이 아니라 1-K를 이런 식으로 풀어봤습니다. 하지만 자꾸 틀리는데 반례를 못찾겠어서 질문 드려봅니다.
<코드 설명>
저 같은 경우 map을 이용해 <한 문자, 문자 개수>를 만들어
개수가 홀수인 문자가 2개 이상이면 "I' m sorry Hansoo"를 출력하며 종료하고
그 외에는 팰린드롬을 만듭니다.
팰린드롬은 다시 문자의 개수가 홀수인 문자가 존재하는 경우와 아닌 경우로 나뉘는데,
존재하는 경우 tmp에 잠시 저장해놓고 나머지는 ret에 철자순으로 저장합니다
그리고 tmp를 ret에 붙인 다음에 substr로 해당 문자열을 복사한 뒤 temp에 저장합니다.
마지막으로 temp를 reverse로 역순배치를 하여 ret에 이어붙입니다.
최종적으로 이를 출력하는 로직입니다.
(문자의 개수가 모두 짝수인 경우는 tmp를 ret에 붙이는 과정만 없고 나머진 동일합니다)
정말 열심히 생각해서 풀었는데 왜 틀렸는지 조차 몰라서 매우 속상합니다...
반례나 틀린 부분이 어디인지 알려주신다면 정말 정말 감사하겠습니다...!
#include <bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
map<char, int> mp;
string word, ret;
bool isOdd = false;
int cnt = 0;
char tmp;
cin >> word;
for(int i = 0; i < word.size(); i++) {
mp[word[i]]++;
}
for(auto it : mp) {
if((it).second % 2 == 1) {
cnt++;
if(cnt > 1) {
cout << "I'm Sorry Hansoo";
break;
}
tmp = (it).first;
isOdd = true;
for(int i = 0; i < (it).second / 2; i++){
ret += (it).first;
}
} else {
for(int i = 0; i < (it).second / 2; i++){
ret += (it).first;
}
}
}
string word2 = ret;
if(isOdd) {
word2 += tmp;
string temp = ret.substr(0, temp.size() - 1);
reverse(temp.begin(), temp.end());
word2 += temp;
} else {
string temp = ret.substr(0, temp.size());
reverse(temp.begin(), temp.end());
word2 += temp;
}
if(cnt < 2)
cout << word2;
return 0;
}
답변 1
2
안녕하세요 성종님 ㅎㅎ 전반적으로 잘 짜셨는데요 ㅎㅎ 제가 체크해야할 부분 주석 달았는데 확인 부탁드립니다.
#include <bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
map<char, int> mp;
//지역변수로 놓았을 때는 쓰레기값이 들어갈 수 있으니 ""로 해주어야 합니다.
//string word, ret;
string word;
string ret = "";
bool isOdd = false;
int cnt = 0;
char tmp;
cin >> word;
for(int i = 0; i < word.size(); i++) {
mp[word[i]]++;
}
for(auto it : mp) {
if((it).second % 2 == 1) {
cnt++;
if(cnt > 1) {
cout << "I'm Sorry Hansoo";
//break가 아니라 return을 하는게 더 좋습니다.
// 코드 상 문제 없지만 이렇게 하면 나중에 실수합니다.
//break;
return 0;
}
tmp = (it).first;
isOdd = true;
for(int i = 0; i < (it).second / 2; i++){
ret += (it).first;
}
} else {
for(int i = 0; i < (it).second / 2; i++){
ret += (it).first;
}
}
}
string word2 = ret;
if(isOdd) {
word2 += tmp;
//이렇게 하면 안됩니다.
// temp가 선언되지도 않았는데 temp.size를 기반으로 하면 안되요.
//string temp = ret.substr(0, temp.size() - 1);
string temp = ret;
reverse(temp.begin(), temp.end());
word2 += temp;
} else {
// string temp = ret.substr(0, temp.size());
string temp = ret;
reverse(temp.begin(), temp.end());
word2 += temp;
}
if(cnt < 2)
cout << word2;
return 0;
}
감사합니다.
코딩 살구 클럽 컴파일 에러
0
4
1
추천 문제
0
7
1
코딩살구클럽 승인
0
9
1
코살구 1주차 1940번 문제 조건과 프라이빗 테스트 불일치 문의
0
21
2
문제를 고민하는 시간 관련
0
26
2
코딩살구클럽
0
38
2
코딩살구클럽 문의
0
37
2
코딩살구클럽 승인
0
35
2
DP 경우의 수 설명이 이해가 되지 않습니다.
0
33
2
3-F 채점 관련 질문
0
31
1
BFS, DFS 활용이 되는 상황에서의 방향성
0
33
2
코딩살구클럽 승인
0
45
2
코딩살구클럽승인
0
39
3
코딩살구클럽 승인
0
54
2
3-D 관련 질문
0
35
2
코살구 회원가입 문의
0
45
2
코살구 로그인 문제
0
65
2
3-A 문제 풀이 관련 질문
0
56
3
2-O 질문 있습니다
0
38
2
2-T 문제에 관한 질문
0
40
2
코딩 살구 클럽 접속 및 사용방법 문의
0
63
2
안녕하세요~. 현재 코살코딩클럽 사이트가 접속이 안됩니다~
0
67
2
코딩살구클럽 로그인문제
0
85
3
코딩 살구 클럽 로그인 문제
0
86
2





