인프런 커뮤니티 질문&답변

Gitae Kim님의 프로필 이미지
Gitae Kim

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

[맞왜틀팁] 출력 | 1-K 보완설명

1-K 맞왜틀 질문입니다

작성

·

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점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


Gitae Kim님의 프로필 이미지
Gitae Kim
질문자

아하.. 빠른 피드백 너무 감사드립니다. 말씀주신 반례와 같은 경우에 홀수 처리가 취약하네요..!

가이드 주신 것처럼 예외처리하는 count개수제한을 (2이상이 아닌) 1 이상으로 하거나,

oddnr++를 I'm Sorry Hansoo 예외처리 분기문보다 더 앞에 뒀어야 하네요.

감사 드립니다.

분기문 처리를 너무 복잡하게 짜는 건 안좋은 습관이라 꾸준히 예제코드 참조해보면서 다듬어보겠습니다.

 

감사합니다.

Gitae Kim님의 프로필 이미지
Gitae Kim

작성한 질문수

질문하기