2 λΆ„ μ†Œμš”

πŸ“ [S3_1213] νŒ°λ¦°λ“œλ‘¬ λ§Œλ“€κΈ°

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// **** input start ****

		String str = br.readLine();

		// **** input end ****

		// μ•ŒνŒŒλ²³ 개수 μ €μž₯ λ°°μ—΄
		int[] arr = new int[26];

		// 총 μ•ŒνŒŒλ²³ 개수
		int sum = str.length();

		// 개수 μ €μž₯
		for (int i = 0; i < str.length(); i++) {
			arr[str.charAt(i) - '0' - 17]++;
		}

		int cnt = 0;
		// λ§Œμ•½ 각각의 μ•ŒνŒŒλ²³μ˜ κ°œμˆ˜κ°€ ν™€μˆ˜κ°œμΈ 것이 2개 이상인 경우 νƒˆλ½
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] % 2 == 1)
				cnt++;
		}

		// μ‹€νŒ¨
		if (cnt >= 2)
			System.out.println("I'm Sorry Hansoo");
		else {
			String res = "";
			// 짝수개인경우
			if (sum % 2 == 0) {
				for (int i = 0; i < arr.length; i++) {
					// μ•ŒνŒŒλ²³μ΄ 있으면
					if (arr[i] > 0) {
						// μ•ŒνŒŒλ²³ 개수의 λ°˜ν‹ˆλ§ŒνΌ res에 λ„£μ–΄μ£Όκ³  넣은 것은 λΉΌμ€€λ‹€
						int temp = arr[i] / 2;
						for (int j = 0; j < temp; j++) {
							res += (char)(i+'A');
							arr[i]--;
						}
					}
				}
				for (int i = arr.length-1; i >= 0; i--) {
					// μ•ŒνŒŒλ²³μ΄ 있으면
					if (arr[i] > 0) {
						// λ‹€ λ„£λŠ”λ‹€
						int temp = arr[i];
						for (int j = 0; j < temp; j++) {
							res += (char)(i+'A');
							arr[i]--;
						}
					}
				}
			}else {		// ν™€μˆ˜ 개 인 경우
				char c = 0;
				// 쀑간에 ν™€μˆ˜κ°œμΈ 것을 λ„£λŠ”λ‹€.
				for(int i=0; i<arr.length;i++) {
					if(arr[i] % 2 == 1) {
						c=(char)(i+'A');
						arr[i]--;
					}
				}
				for (int i = 0; i < arr.length; i++) {
					// μ•ŒνŒŒλ²³μ΄ 있으면
					if (arr[i] > 0) {
						// μ•ŒνŒŒλ²³ 개수의 λ°˜ν‹ˆλ§ŒνΌ str에 λ„£μ–΄μ£Όκ³  넣은 것은 λΉΌμ€€λ‹€
						int temp = arr[i] / 2;
						for (int j = 0; j < temp; j++) {
							res += (char)(i+'A');
							arr[i]--;
						}
					}
				}
				res += c;
				for (int i = arr.length-1; i >= 0; i--) {
					// μ•ŒνŒŒλ²³μ΄ 있으면
					if (arr[i] > 0) {
						// λ‹€ λ„£λŠ”λ‹€
						int temp = arr[i];
						for (int j = 0; j < temp; j++) {
							res += (char)(i+'A');
							arr[i]--;
						}
					}
				}
			}
			System.out.println(res);
		}

	} // main end
} // class end

πŸ€” λ‚˜μ˜ 생각

보자마자 μ–΄λ–»κ²Œ ν’€κΉŒ 고민을 많이 ν–ˆλ‹€..
생각해낸 방법은 μž…λ ₯받은 String κ°’μ—μ„œ 각 μ•ŒνŒŒλ²³μ˜ 개수λ₯Ό μ €μž₯ν•΄μ„œ μ•žμ—μ„œλΆ€ν„° λ’€λ‘œ μ™•λ³΅μœΌλ‘œ κ°œμˆ˜κ°€ 있으면 좜λ ₯ν•΄μ£ΌλŠ” 것이닀.
단 μ•ŒνŒŒλ²³μ˜ 개수의 1/2 만큼 좜λ ₯ν•΄μ€˜μ•Ό ν•œλ‹€. μ™œλƒλ©΄ μ•ž λ’€κ°€ λ°μΉΌμ½”λ§ˆλ‹ˆμ²˜λŸΌ κ°™μ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έ.
그리고 λ§Œμ•½ μ•ŒνŒŒλ²³μ˜ 총 κ°œμˆ˜κ°€ ν™€μˆ˜κ°œ 일 λ•ŒλŠ” ν™€μˆ˜κ°œμ˜ μ•ŒνŒŒλ²³ ν•˜λ‚˜λ₯Ό λ¨Όμ € λ”°λ‘œ λΉΌλ†”μ„œ λ‚˜μ€‘μ— λ„£μ–΄μ€˜μ•Ό ν•œλ‹€.
이 과정듀을 정리해 보겠닀.

  • λ¨Όμ € μ•ŒνŒŒλ²³μ˜ 개수λ₯Ό 배열에 μ €μž₯ν•΄ μ€€λ‹€.
  • λ§Œμ•½ ν™€μˆ˜κ°œμΈ μ•ŒνŒŒλ²³μ˜ κ°œμˆ˜κ°€ 2개 이상인 경우 νŒ°λ¦°λ“œλ‘¬μ΄ λ§Œλ“€μ–΄ 지지 μ•ŠκΈ° λ•Œλ¬Έμ— β€˜I’m Sorry Hansoo’ λ₯Ό 좜λ ₯ν•΄μ€€λ‹€.
  • λ§Œμ•½ 쑰건이 μ„±λ¦½ν•œλ‹€λ©΄ 두 가지 경우둜 λ‚˜λˆ„μ–΄μ„œ 생각해 μ€€λ‹€.
    • 쓰인 μ•ŒνŒŒλ²³μ˜ κ°œμˆ˜κ°€ 짝수인 경우
      • μ•žμ—μ„œ λ’€λ‘œ κ°€λ©΄μ„œ μ•ŒνŒŒλ²³μ˜ 개수의 1/2 만큼 좜λ ₯ν•΄μ€€λ‹€.
      • λ’€μ—μ„œ μ•žμœΌλ‘œ μ˜€λ©΄μ„œ 남은 μ•ŒνŒŒλ²³μ„ λͺ¨λ‘ 좜λ ₯ν•΄μ€€λ‹€.
    • 쓰인 μ•ŒνŒŒλ²³μ˜ κ°œμˆ˜κ°€ ν™€μˆ˜μΈ 경우
      • μ•žμ—μ„œ λ’€λ‘œ κ°€λ©΄μ„œ μ•ŒνŒŒλ²³μ˜ 개수의 1/2 만큼 좜λ ₯ν•΄μ€€λ‹€.
      • 쀑간에 μ•ŒνŒŒλ²³μ˜ κ°œμˆ˜κ°€ ν™€μˆ˜μΈ μ•ŒνŒŒλ²³μ„ λ”°λ‘œ 좜λ ₯ν•΄μ€€λ‹€.
      • λ’€μ—μ„œ μ•žμœΌλ‘œ μ˜€λ©΄μ„œ 남은 μ•ŒνŒŒλ²³μ„ λͺ¨λ‘ 좜λ ₯ν•΄μ€€λ‹€.
  • μ΄λ ‡κ²Œ 좜λ ₯ν•΄μ£Όλ©΄ μžλ™μœΌλ‘œ μ‚¬μ „μˆœμœΌλ‘œ μ•žμ„œλŠ” 것이 좜λ ₯λœλ‹€.