1657. Determine if Two Strings Are Close

  • νŠΉμ •ν•œ 두 가지 μ’…λ₯˜μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν–ˆμ„ λ•Œ 두 λ¬Έμžμ—΄μ΄ κ°™μ•„μ§ˆ 수 μžˆλŠ”μ§€ μ•Œμ•„λ³΄λŠ” 문제.
    • μž‘μ—… 1: μž„μ˜μ˜ μœ„μΉ˜μ— μžˆλŠ” 두 문자의 μœ„μΉ˜λ₯Ό λ°”κΎΌλ‹€
    • μž‘μ—… 2: λ¬Έμžμ—΄μ— ν¬ν•¨λœ μ„œλ‘œ λ‹€λ₯Έ 두 μ•ŒνŒŒλ²³μ„ κ΅μ²΄ν•œλ‹€ (e.g. abaa β†’ babb)
  • μž‘μ—…μ˜ νŠΉμ§•μ„ κ³ λ €ν•œλ‹€.
    • μž‘μ—… 1이 μ˜λ―Έν•˜λŠ” λ°”λŠ” 문자의 μœ„μΉ˜λŠ” 관계가 μ—†λ‹€λŠ” 것이닀. 즉, 각 μ•ŒνŒŒλ²³μ˜ μΆœν˜„ λΉˆλ„λ§Œ μƒκ°ν•˜λ©΄ λœλ‹€.
    • μž‘μ—… 2κ°€ μ˜λ―Έν•˜λŠ” λ°”λŠ” νŠΉμ •ν•œ 두 μ•ŒνŒŒλ²³μ˜ μΆœν˜„λΉˆλ„λ₯Ό κ΅ν™˜ν•˜λ©΄ μ–‘μͺ½μ˜ μ•ŒνŒŒλ²³ μΆœν˜„ λΉˆλ„κ°€ κ°™μ•„μ§„λ‹€λŠ” 것이닀.
  • λ‹€μŒκ³Ό 같이 ν’€μ΄ν•œλ‹€.
    • λ¨Όμ € 두 λ¬Έμžμ—΄μ˜ κΈΈμ΄λŠ” κ°™μ•„μ•Ό ν•œλ‹€.
    • 두 λ¬Έμžμ—΄ 각각에 λŒ€ν•΄μ„œ 각 μ•ŒνŒŒλ²³μ˜ μΆœν˜„ λΉˆλ„λ₯Ό μ„Όλ‹€.
    • 첫번째 λ¬Έμžμ—΄μ˜ 각 μ•ŒνŒŒλ²³ λ³„λ‘œ μΆœν˜„ λΉˆλ„λ₯Ό λΉ„κ΅ν•œλ‹€.
    • λ§Œμ•½μ— μΆœν˜„ λΉˆλ„κ°€ λ‹€λ₯΄λ‹€ counter1[i] β‰  counter2[i] λ©΄,
      • 첫번째 λ¬Έμžμ—΄μ˜ μΆœν˜„ λΉˆλ„ counter1[i] κ°€ 0 이라면 κ΅ν™˜μ΄ λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 두 λ¬Έμžμ—΄μ€ λ‹€λ₯Έ κ²ƒμœΌλ‘œ λ³Έλ‹€.
      • κ΅ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€λ©΄ ν˜„μž¬ μ•ŒνŒŒλ²³ λ’€μͺ½ i + 1에 μžˆλŠ” μ•ŒνŒŒλ²³ 쀑에 같은 μΆœν˜„ λΉˆλ„λ₯Ό 가진 μ•ŒνŒŒλ²³κ³Ό κ΅ν™˜ν•œλ‹€.
        • ν˜„μž¬ μ•ŒνŒŒλ²³ μ•žμͺ½μœΌλ‘œλŠ” 이미 μ–‘μͺ½ λ¬Έμžμ—΄μ—μ„œμ˜ μΆœν˜„ λΉˆλ„λ₯Ό 맞좘 것이기 λ•Œλ¬Έμ— κ΅ν™˜ν•˜λ©΄ μ•ˆλœλ‹€.
      • κ΅ν™˜μ΄ λΆˆκ°€ν•˜λ©΄ 두 λ¬Έμžμ—΄μ€ λ‹€λ₯Έ κ²ƒμœΌλ‘œ λ³Έλ‹€.
class Solution { void countCharacters(String word, int[] counter) { for (int i = 0; i < word.length(); ++i) { ++counter[word.charAt(i) - 'a']; } } public boolean closeStrings(String word1, String word2) { if (word1.length() != word2.length()) return false; int[] counter1 = new int[26]; int[] counter2 = new int[26]; countCharacters(word1, counter1); countCharacters(word2, counter2); for (int i = 0; i < 26; ++i) { if (counter1[i] == counter2[i]) continue; else if (counter1[i] == 0) return false; boolean found = false; for (int j = i + 1; j < 26; ++j) { if (counter1[j] > 0 && counter1[j] == counter2[i]) { int temp = counter1[i]; counter1[i] = counter1[j]; counter1[j] = temp; found = true; break; } } if (!found) return false; } return true; } }