inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

1-K 맞왜틀 질문입니다

103

Gitae Kim

작성한 질문수 7

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을 다루는 부분이 다소 정돈되지 못하여 이해가 어려우실 수 있을 것 같습니다. 양해 부탁드립니다.

 

c++ 코딩-테스트

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

감사합니다.

강사 큰돌 올림.


0

Gitae Kim

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

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

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

감사 드립니다.

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

 

감사합니다.

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

8

0

교안 158페이지 문의드립니다

0

25

2

코딩살구클럽 관련 건의사항

0

57

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

27

1

진행 방법 질문드립니다!

0

58

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

59

2

2주차 개념#12 트리 순회

0

29

2

백준사이트가 종료된다고 합니다.

0

289

2

백준 서비스 종료

9

894

1

sk 하이닉스 코테 대비

0

370

2

3-G 최댓값 질문

0

51

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

83

2

3-I 코드 질문드립니다.

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

102

2

4-H 질문 있습니다 (코드 리뷰)

0

66

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

173

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

69

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

64

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

51

2

조합 재귀 풀이 확인 해주시면 감사하겠습니다.

0

68

2

함수별 시간복잡도

0

73

2

3-h 질문입니다.

0

49

1

안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.

0

53

2