본문 바로가기
개발 노트/백준, 프로그래머스 풀이

백준 1213/c++ )) 팰린드롬 만들기

by tokkiC 2022. 6. 15.

아스키 코드 범위 이상(127개 이상)의 배열 cnt[200] 을 만들고 입력한 문자열 s를 돌며 각 문자를 반복자가

가리킬때마다 cnt[가리킨 문자의 아스키코드 넘버]의 값을 1씩 더해주어 s의 문자별 개수 데이터를 저장한다

알파벳 뒤부터 안으로 가야하므로 Z부터 A까지 하나씩 빼며 더하여 수행한다

홀수 개수를 갖는 문자가 하나면 mid 를 만들어주고 홀수 개수를 갖는 문자가 2개 이상이면 탈출한다

빈 결과문부터 시작해서 양옆에 문자를 하나씩 붙여서 만들어주고  홀수개수 문자가 딱 하나 있어서 mid 가 있다면

 결과문 시작부터 결과문 길이 반만큼의 위치에 mid를 삽입한다

홀수 개수를 갖는 문자가 2개 이상이면 실패문구를 출력하고, 그 외에는 정상 결과문을 출력한다

 

어려웠던 점

아스키 코드 비교를 위해 cnt[200] 를 만들어 문자 개수를 카운트 하는 점

홀수 개수가 하나면 그 하나를 써서 mid 를 만들고 하나를 썼으니 --하여 짝수로 만드는 점

한 문자 개수 2개당 한번씩 빈 결과 문자열에 양옆에 하나씩 붙여주는 점

mid를 처음+결과열 사이즈 절반 만큼 붙인 위치인 가운데에 넣어주는 점

개인적으로 매우 어려웠던 문제다. 꼭 복습하자

#include <bits/stdc++.h>
using namespace std;

string s;

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	// cnt 는 아스키 코드가 담긴 배열. 아스키 코드는 127개이니 127개 이상으로 여유있게 할당하자 
	// main 함수내에서 선언하면 main 함수도 함수내 선언이므로 기본 0 초기화가 되지 않는다
	// 전역변수만이 0으로 디폴트 초기화 되므로 함수 내 변수는 꼭 초기화를 해주자  
	int cnt[200]={0};
	int flag=0;
	char mid=0;
	string ret;
	
	cin >> s;
//	 s를 돌며 문자를 하나씩 더해가며 s의 문자당 개수 카운트. s의 하나하나인 k 는 문자이므로 char, int, auto 다 된다  
	for(int k : s){
		cnt[k]++;
	} 
	// Z부터 A까지 줄여나가면서 각 문자별로 실행한다 
	for(int i='Z'; i>='A'; i--){
		// 중복되는 문자가 있다면(1이상이라면 true) 실행해라 
		if(cnt[i])
			// 홀수인지 확인하고( cnt[i]&1 의 경우도 홀수이다 - 비트연산자- 마지막 비트가 1이면 홀수라는 연산 )
			if(cnt[i]%2==1){
				//홀수라면 가운데에 둘걸 mid라 하고 그 하나를 중복개수에서 빼준다. 보기 좋도록 char(i)로 형변환을 해도 된다  
				mid=char(i);
				cnt[i]--;
				// 홀수인 문자 개수에 카운트
				flag++;
			}
			// 홀수인 문자 개수가 2개라면 문자 더 돌거 없이 반복문 종료 
			if(flag==2)
				break;
			// 중복 개수가 2개 단위로 있으므로(홀수면 위에서 --됨) 2개 늘때마다 한번만 실행하도록 j+=2씩 증가  
			// 중복 문자 2개당 결과문자열 ret 앞뒤로 하나씩 붙여준다 
			for(int j=0; j<cnt[i]; j+=2){
				ret = char(i) + ret;
				ret = ret + char(i);				
			}		
	}
	// 홀수여서 mid로 삼을게 하나 있다면 mid !=0 이므로 실행해라.
	// 홀수개여서 만든 mid 를 결과문 ret의 가운데에 삽입해라
	// 가운데는 시작위치 + 결과문 길이 절반 이다  
	if(mid){
		ret.insert(ret.begin()+ret.size()/2, mid);
	}
	// 홀수인 문자 개수가 2개라면 다음을 출력해라 
	if(flag==2){
		cout << "I'm Sorry Hansoo\n";
	// 아니면 다음을 출력해라 - 결과문자열 ret 
	} else {
		cout << ret << "\n";
	}		
	
	return 0;
}

댓글