작성
·
38
0
안녕하세요, 1213번(1-K번) 맞왜틀 질문이 있어 질문 올립니다.
마땅한 반례를 제 시간에 떠올리지 못해, 반례에 대한 힌트를 얻을 수 있을까 하여 질문 드립니다.
코드는 아래와 같습니다.
http://boj.kr/556e9aa7a033414a80ac86819811d8a7
입력된 string의 각 알파벳을 Key, 각 알파벳 개수를 value로 하는 map을 이용하여 풀어보려 했습니다.
입력된 string의 각 알파벳 및 알파벳 개수를 _nr_char이라는 map에 저장한 후,
_nr_char의 value가 홀수인 것(_odd_nr로 count합니다)이 2개 이상이면 I'm Sorry Hansoo를 출력하게 했고,
홀수인 것이 1개라면 29번 라인으로,
홀수인 것이 없다면 56번 라인으로 분기하여 처리합니다.
29번 라인은 _nr_char에 저장된 알파벳을 output2란 string에 차례대로 저장한 후,
홀수 알파벳을 output2에 마지막으로 push_back으로 저장합니다.
이후 output2를 대칭복사한 output를 출력합니다.
56번 라인은 _nr_char에 저장된 알파벳을 output2란 string에 차례대로 저장한 후,
output2를 대칭복사한 output를 출력합니다.
string을 다루는 부분이 다소 정돈되지 못하여 이해가 어려우실 수 있을 것 같습니다. 양해 부탁드립니다.
답변 1
1
안녕하세요 기태님 ㅎㅎ
코드 거의 대부분을 잘 짜셨는데 분기처리 부분에서 너무 복잡해지고 + 홀수부분을 잘 처리를 못해 -> 틀리는 것 같습니다.
예를 들어 다음과 같은 반례를 해결하지 못합니다.
반례:
ABACABAA
기태님 코드 : AABCBAA
제가 기태님 코드 기반으로 한번 다듬어봤습니다.
이렇게 한번 해보시겠어요?
#include <bits/stdc++.h>
using namespace std;
string input;
map<char, int> _nr_char;
char output[54];
string output2;
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int _odd_nr = 0;
char _odd_let = 0;
cin >> input;
// 문자 개수 세기
for(int i = 0; i < input.size(); i++) {
_nr_char[input[i]]++;
}
// 홀수 개수 문자 확인 및 해당 홀스 문자 설정
for(auto it : _nr_char) {
if(it.second % 2 != 0) {
if(_odd_nr >= 1) {
cout << "I'm Sorry Hansoo";
return 0;
}
_odd_nr++;
_odd_let = it.first;
}
}
// 팔린드롬의 절반 만들기
int idx = 0;
for(auto it : _nr_char) {
for(int k = 0; k < it.second / 2; k++) {
output[idx] = it.first;
output[input.size() - 1 - idx] = it.first;
idx++;
}
}
// 홀수 개수 문자가 있으면 중간에 추가
if(_odd_nr == 1) {
output[input.size() / 2] = _odd_let;
}
cout << output << "\n";
return 0;
}
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
아하.. 빠른 피드백 너무 감사드립니다. 말씀주신 반례와 같은 경우에 홀수 처리가 취약하네요..!
가이드 주신 것처럼 예외처리하는 count개수제한을 (2이상이 아닌) 1 이상으로 하거나,
oddnr++를 I'm Sorry Hansoo 예외처리 분기문보다 더 앞에 뒀어야 하네요.
감사 드립니다.
분기문 처리를 너무 복잡하게 짜는 건 안좋은 습관이라 꾸준히 예제코드 참조해보면서 다듬어보겠습니다.
감사합니다.