451. Sort Characters By Frequency

  • λ¬Έμžμ—΄μ— μ†ν•œ κΈ€μžλ“€μ„ μΆœν˜„ λΉˆλ„μ— 따라 λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ λ‚˜μ—΄ν•˜λŠ” 문제.
    • λ¬Έμžμ—΄μ€ μ•ŒνŒŒλ²³ λŒ€, μ†Œλ¬Έμž, 숫자둜 μ΄λ£¨μ–΄μ Έμžˆλ‹€.
  • μ•„λž˜μ™€ 같이 ν’€μ΄ν•œλ‹€.
    • 각 κΈ€μžλ“€μ˜ μΆœν˜„ λΉˆλ„λ₯Ό μ„Έμ–΄μ„œ κΈ€μžμ™€ ν•¨κ»˜ λ°°μ—΄ pairs 에 μ €μž₯ν•œλ‹€.
      • Map<Character, Integer>을 μ‚¬μš©ν•  μˆ˜λ„ μžˆκ² μ§€λ§Œ μƒλŒ€μ μœΌλ‘œ 속도가 λŠλ¦¬λ‹€.
      • μ•ŒνŒŒλ²³ λŒ€, μ†Œλ¬Έμž, 숫자 κΈ€μžμ˜ λ²”μœ„κ°€ 0 ~ z κΉŒμ§€μž„μ„ κ°μ•ˆν•˜μ—¬ λ°°μ—΄μ˜ ν¬κΈ°λŠ” 두 λ¬Έμžκ°„μ˜ 차이 + 1둜 μž‘λŠ”λ‹€.
      • 쀑간에 λΆˆν•„μš”ν•œ κΈ€μžλ“€μ΄ μžˆκΈ°λŠ” ν•˜μ§€λ§Œ λ²”μœ„λ₯Ό 3개(숫자, μ•ŒνŒŒλ²³ λŒ€λ¬Έμž, μ•ŒνŒŒλ²³ μ†Œλ¬Έμž)둜 λ‚˜λˆ„μ–΄ 각각을 index에 λŒ€μ‘μ‹œν‚€λ©΄ 쑰건문이 λ“€μ–΄κ°€λ―€λ‘œ 속도가 λŠλ €μ§€λŠ” 것 λ³΄λ‹€λŠ” λ‚«λ‹€.
    • μΆœν˜„ λΉˆλ„μ— 따라 배열을 μ •λ ¬ν•œλ‹€.
    • 배열을 μˆœνšŒν•˜λ©΄μ„œ 각 κΈ€μžλ₯Ό μΆœν˜„ λΉˆλ„λ§ŒνΌ λ³΅μ œν•˜μ—¬ 결과에 λ”ν•œλ‹€.
class Solution { final int L = 'z' - '0' + 1; public String frequencySort(String s) { int[][] pairs = new int[L][2]; for (char c = '0'; c <= 'z'; ++c) { pairs[c - '0'][0] = c; } for (int i = 0; i < s.length(); ++i) { ++pairs[s.charAt(i) - '0'][1]; } Arrays.sort(pairs, (a, b) -> b[1] - a[1]); StringBuilder result = new StringBuilder(); for (int[] pair : pairs) { result.append(String.valueOf(Character.valueOf((char)pair[0])).repeat(pair[1])); } return result.toString(); } }