Koder / 박성훈
article thumbnail

맞왜틀 ㅡㅡ

뇌절좀 친 문제였다.

팰린드롬을 만들 수 있는 문자열의 특징은

각 문자가 짝수개이여야 하는데,

홀수개인 문자는 하나만 존재하거나 없어야 한다.

 

이 특성에 맞는지 체크한다음, 아니면 I'm Sorry Hansoo를,

맞다면 팰린드롬으로 출력하면 되는 문제이다.

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int alpha[1234] = {0};
char arr[100] = {0};

int main(){
	scanf("%s", arr);
	int len = strlen(arr);
	char out=0;
	for(int i=0; i<len; i++){ if('A'<=arr[i] && arr[i]<='Z') alpha[arr[i]]++; }
	
	int chk = 0;
	for(int i='A'; i<='Z'; i++) if(alpha[i]%2 == 1){ chk++; out=i; }
	if(chk != 1 && chk != 0){ printf("I\'m Sorry Hansoo"); return 0; }
	
	for(int i='A'; i<='Z'; i++){
		if(alpha[i] != 0){
			int tmp = alpha[i]/2;
			for(int j=0; j<tmp; j++) printf("%c", i);
			alpha[i]-=tmp;
		}
	}
	
	if(out != 0){
		printf("%c", out);
		alpha[out]--;
	}
	
	for(int i='Z'; i>='A'; i--){
		if(alpha[i] != 0){
			for(int j=0; j<alpha[i]; j++) printf("%c", i);
		}	
	}
	
	return 0;
}

alpha는 문자의 등장횟수를 세는 배열이다.

	int chk = 0;
	for(int i='A'; i<='Z'; i++) if(alpha[i]%2 == 1){ chk++; out=i; }
	if(chk != 1 && chk != 0){ printf("I\'m Sorry Hansoo"); return 0; }

이 부분에서 팰린드롬의 조건을 체크하고,

 

	for(int i='A'; i<='Z'; i++){
		if(alpha[i] != 0){
			int tmp = alpha[i]/2;
			for(int j=0; j<tmp; j++) printf("%c", i);
			alpha[i]-=tmp;
		}
	}

사전순 출력이므로

A부터 시작해서

짝수개인 알파벳들을 출력할때

"절반만" (팰린드롬을 만들어야 하므로) 사전순으로 출력해주었고,

 

	if(out != 0){
		printf("%c", out);
		alpha[out]--;
	}

홀수개인 문자가 있는 경우 해당 문자를 따로 출력해주고,

 

	for(int i='Z'; i>='A'; i--){
		if(alpha[i] != 0){
			for(int j=0; j<alpha[i]; j++) printf("%c", i);
		}	
	}

마지막으로 남은 문자들은

팰린드롬을 만들어야 하므로

역순으로 출력해주면

깔끔하게 AC가 나온다.

반응형