Algorithm/๋ฐฑ์ค€

1213๋ฒˆ - ํŒฐ๋ฆฐ๋“œ๋กฌ ๋งŒ๋“ค๊ธฐ

giraffe_ 2022. 8. 11. 19:07

 

https://www.acmicpc.net/problem/1213

 

1213๋ฒˆ: ํŒฐ๋ฆฐ๋“œ๋กฌ ๋งŒ๋“ค๊ธฐ

์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ๋Š” "I'm Sorry Hansoo"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ •๋‹ต์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์ „์ˆœ์œผ๋กœ ์•ž์„œ๋Š” ๊ฒƒ์„ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net

 

 

 

 

 

์ˆœ์—ด์„ ๊ตฌํ•ด ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋Œ€ํ•ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ํŒ๋ณ„ํ•ด์คฌ๋‹ค.

๊ทผ๋ฐ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค... ์ƒ๊ฐํ•ด๋ณด๋‹ˆ 50๊ธ€์ž๋ฉด ๋ฌด๋ ค 50!์ด๋‚˜ ๋œ๋‹ค.

 

 

 

 

 

์ฝ”๋“œ - ์‹œ๊ฐ„ ์ดˆ๊ณผ

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class b1213 {
	static char[] chs;
	static boolean[] visited;
	static char[] result;
	static List<String> list;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		chs = sc.next().toCharArray();
		
		visited = new boolean[chs.length];
		result = new char[chs.length];
		list = new ArrayList<>();
		
		permutation(0); //์ˆœ์—ด
		
		//์ถœ๋ ฅ
		if(list.size() == 0) {
			System.out.println("I'm Sorry Hansoo");
		} else {
			Collections.sort(list);
			System.out.println(list.get(0));
		}
	}

	public static void permutation(int count) {
		if(count == chs.length) {
			if(isPalindrome()) { //ํŒฐ๋ฆฐ๋“œ๋กฌ ํŒ๋ณ„
				String str = String.valueOf(result);
				list.add(str);
			}
			
			return;
		}
		
		for(int i = 0; i < chs.length; i++) {
			if(visited[i]) continue;
			visited[i] = true;
			
			result[count] = chs[i]; //๊ฒฐ๊ณผ ๋ฐฐ์—ด์— ์ €์žฅ
			
			permutation(count + 1);
			visited[i] = false;
		}
		
	}

	public static boolean isPalindrome() {
		for(int i = 0; i < chs.length / 2; i++) {
			if(result[i] != result[chs.length - i - 1]) {
				return false;
			}
		}
		return true;
	}

}

 

 

 

 

 

 

์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ๋จผ์ € ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ฑธ๋Ÿฌ์ค˜์•ผ ํ•œ๋‹ค.

 

์–ด๋–ค ์•ŒํŒŒ๋ฒณ ์ˆ˜๊ฐ€ ํ™€์ˆ˜๊ฐœ์ธ ๊ฒƒ์ด 2๊ฐœ ์ด์ƒ์ด๋ฉด, ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ๋  ์ˆ˜๊ฐ€ ์—†๋‹ค. 0๊ฐœ ๋˜๋Š” 1๊ฐœ(ํ•ด๋‹น ์•ŒํŒŒ๋ฒณ์ด ๊ฐ€์šด๋ฐ์— ๋“ค์–ด๊ฐ)์—ฌ์•ผ ํ•œ๋‹ค. 

๊ทธ๋ž˜์„œ ์ˆœ์—ด์— ์•ž์„œ ๊ฐ ์•ŒํŒŒ๋ฒณ ์ˆ˜๋ฅผ ์นด์šดํŒ…ํ•˜๊ณ  ํ™€์ˆ˜๊ฐœ์ธ ๊ฒƒ์ด 2๊ฐœ์ธ์ง€ ํŒ๋ณ„ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์ถ”๊ฐ€ํ•ด์คฌ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์‹œ๊ฐ„์ดˆ๊ณผ... ๊ทธ๋ž˜๋„ ์ˆœ์—ด์„ ์‚ฌ์šฉํ•ด์„œ ์—ฌ์ „ํžˆ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

์ˆœ์—ด์„ ๋ฒ„๋ฆฌ๊ณ  ์ง์ ‘ ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ ๋ฌธ์ž๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ์ ‘๊ทผ์„ ๋“ฃ๊ณ  ๊ทธ๋ ‡๊ฒŒ ํ’€์—ˆ๋‹ค.

 

 

 

 

 

์ฝ”๋“œ - ์„ฑ๊ณต

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		String input = sc.next();
		
		int[] alphabet = new int[26];
		
		for(int i = 0; i < input.length(); i++) { //์•ŒํŒŒ๋ฒณ ์ˆ˜ ์ €์žฅ
			alphabet[input.charAt(i) - 'A']++;
		}
		
		int oddCount = 0;
		char oddChar = ' ';
		for(int i = 0; i < 26; i++) { //ํ™€์ˆ˜๊ฐœ์ธ ์•ŒํŒŒ๋ฒณ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
			if(alphabet[i] % 2 == 1) {
				oddCount++;
				oddChar = (char)(i + 65);
			}
			
			if(oddCount == 2) break;
		}
		
		String answer = "";
		if(oddCount == 2) { //๋ถˆ๊ฐ€๋Šฅ
			answer = "I'm Sorry Hansoo";
		} else { //ํ™€์ˆ˜๊ฐœ์ธ ์•ŒํŒŒ๋ฒณ 0๊ฐœ or 1๊ฐœ
			String front = "";
			String tail = "";
			
			for(int i = 0; i < 26; i++) {
				if(alphabet[i] >= 2) {
					for(int j = 0; j < alphabet[i] / 2; j++) {
						front += (char)(i + 65);
					}
				}
			}
			
			StringBuilder sb = new StringBuilder(front);
			tail = sb.reverse().toString();
			
			if(oddCount == 0) { //์ •๋‹ต ๋„์ถœ
				answer = front + tail;
			}else if(oddCount == 1){
				answer = front + oddChar + tail;
			}
		}
		
		//์ถœ๋ ฅ
		System.out.println(answer);
	}

}

 

 

 

 

 

๊ฐ๊ฐ์˜ ์•ŒํŒŒ๋ฒณ์ด ๋‚˜์˜ค๋Š” ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” 26์นธ ์งœ๋ฆฌ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ™€์ˆ˜๊ฐœ์ธ ์•ŒํŒŒ๋ฒณ ๊ฐœ์ˆ˜๋ฅผ ์„ผ๋‹ค.

์ด๋•Œ ํ˜•๋ณ€ํ™˜์— ์ฃผ์˜ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๋Œ€๋ฌธ์ž A์˜ ์•„์Šคํ‚ค ์ฝ”๋“œ์ธ 65๋ฅผ ๊ธฐ์–ตํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

ํ™€์ˆ˜๊ฐœ์ธ ์•ŒํŒŒ๋ฒณ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋ฉด์„œ ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๋„๋ก ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ   2๊ฐœ ์ด์ƒ์ด๋ฉด ๊ทธ๋งŒ๋‘๊ฒŒ ํ–ˆ๋‹ค.

 

๊ทธ ๋‹ค์Œ 2๊ฐœ๋ฉด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•˜๊ณ , 0๊ฐœ๋‚˜ 1๊ฐœ์ด๋ฉด ํŒฐ๋ฆฐ๋“œ๋กฌ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค๋„๋ก ํ–ˆ๋‹ค.

์‚ฌ์ „์ˆœ์œผ๋กœ ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ๋จผ์ €์˜ค๋Š” ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰์„ ํ•ด ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค๋„๋ก ํ–ˆ๋‹ค.

ํŒฐ๋ฆฐ๋“œ๋กฌ์€ ๋Œ€์นญ์ด๋ฏ€๋กœ ์•ž ์ค‘๊ฐ„ ๋’ค๋กœ ๋‚˜๋ˆด๋‹ค. ์•ŒํŒŒ๋ฒณ์„ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ ์„œ ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ๋ฌธ์ž๋ฅผ ๋ถ™์—ฌ ์•ž ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  String์˜ reverse() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์•ž ๋ฌธ์ž์—ด์„ ๋’ค์ง‘์–ด์„œ ๋’ค ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์—ˆ๋‹ค. reverse๋ฅผ ํ•˜๋ ค๋ฉด StringBuilder StringBuilder๋กœ ๋ณ€ํ™˜ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  0๊ฐœ์ด๋ฉด ์ค‘๊ฐ„ ๋ฌธ์ž์—ด ์—†์ด ์•ž๋’ค๋งŒ ๋ถ™์—ฌ์„œ ์ •๋‹ต์„ ๋„์ถœํ•˜๊ณ , 1๊ฐœ์ธ ๊ฒฝ์šฐ์—๋Š” ์ค‘๊ฐ„์— ํ™€์ˆ˜๊ฐœ์ธ ์•ŒํŒŒ๋ฒณ์„ ๋ถ™์—ฌ์คฌ๋‹ค.

 

 

 

 

 

๊ฒฐ๊ณผ