본문 바로가기
Algorithm/BOJ

[백준] 1213번 팰린드롬 만들기 자바

by YOONAYEON 2022. 4. 29.
문제

 

 

1213번: 팰린드롬 만들기

첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 "I'm Sorry Hansoo"를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.

www.acmicpc.net

 

문제 풀이

 

1. HashMap을 이용하여 각 알파벳이 나온 횟수 저장

2. 홀수개인 알파벳이 2개 이상될 경우 팰린드롬을 못 만드므로 바로 리턴

3. HashMap을 key값으로 정렬한 후 짝수개인 알파벳을 정답배열의 양쪽에 넣는다.

   홀수개인 알파벳은 양쪽에 담은 후 따로 temp변수에 보관해 둔다.

4. 정답배열에 가운데에 홀수개인 알파벳을 넣는다.

 

 

소스 코드

 

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String str = sc.next();
		sc.close();
		char[] answer = new char[str.length()];
		HashMap<Character, Integer> map = new HashMap<>();
		
		for(int i = 0; i < str.length(); i++) {
			if(map.containsKey(str.charAt(i)))
				map.put(str.charAt(i), map.get(str.charAt(i)) + 1);
			else 
				map.put(str.charAt(i), 1);
		}
		
		boolean check = false;
		for(int a : map.values()) {
			if(a % 2 != 0) {
				if(check) {
					System.out.println("I'm Sorry Hansoo");
					return;
				}
				check = true;
			}
		}
		
		char temp = 'a';
		int sidx = 0, eidx = str.length()-1;
		
		int idx = 0;
		char[] arr = new char[map.size()];
		for(char c: map.keySet()) {
			arr[idx++] = c;
		}
		Arrays.sort(arr);
		
		for(char c: arr) {	
			//짝수개이면
			if(map.get(c) % 2 == 0) {
				for(int i = 0; i < map.get(c); i+=2) {
					answer[sidx++] = c;
					answer[eidx--] = c;	
				}
			}else {
				for(int i = 0; i < map.get(c) - 1; i+=2) {
					answer[sidx++] = c;
					answer[eidx--] = c;
				}
				temp = c;
			}
		}
		
		if(temp != 'a')
			answer[sidx] = temp;
		for(char c : answer)
			System.out.print(c);
	}

}