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

성종님의 프로필 이미지
성종

작성한 질문수

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

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

해결된 질문

작성

·

405

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;
}

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

 

감사합니다.

성종님의 프로필 이미지
성종
질문자

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

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

성종님의 프로필 이미지
성종

작성한 질문수

질문하기