inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

1-K 관련 질문 드립니다!

해결된 질문

443

성종

작성한 질문수 3

2

안녕하세요 큰돌님!

다름이 아니라 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;
}

c++ 코딩-테스트

답변 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

성종

아하 저런 부분을 놓치고 있었군요..! 시간 내서 답변 해주셔서 감사합니다 :)

좋은 강의 더 열심히 듣겠습니다!

5-B

0

3

1

4 - A

0

29

2

코딩살구클럽 입장이 안됩니다

0

76

2

4-F 경우의 수 질문입니다.

0

34

2

코딩살구클럽 가입이 안됩니다.

0

79

2

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

0

60

1

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

0

46

2

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

0

117

1

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

0

45

1

진행 방법 질문드립니다!

0

81

2

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

0

64

2

2주차 개념#12 트리 순회

0

32

2

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

0

316

2

백준 서비스 종료

9

952

1

sk 하이닉스 코테 대비

0

387

2

3-G 최댓값 질문

0

54

1

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

0

84

2

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

0

66

2

3-N 질문 있습니다.

0

68

2

학습방법

0

105

2

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

0

69

2

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

0

186

2

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

0

72

2

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

0

66

2