[Easy] 1790. Check if One String Swap Can Make Strings Equal

문제

You are given two strings s1 and s2 of equal length. A string swap is an operation where you choose two indices in a string (not necessarily different) and swap the characters at these indices.

Return true if it is possible to make both strings equal by performing at most one string swap on exactly one of the strings. Otherwise, return false.

 

예시

Example 1:

Input: s1 = "bank", s2 = "kanb"
Output: true
Explanation: For example, swap the first character with the last character of s2 to make "bank".

Example 2:

Input: s1 = "attack", s2 = "defend"
Output: false
Explanation: It is impossible to make them equal with one string swap.

Example 3:

Input: s1 = "kelb", s2 = "kelb"
Output: true
Explanation: The two strings are already equal, so no string swap operation is required.

 

제약 조건

Constraints:

  • 1 <= s1.length, s2.length <= 100
  • s1.length == s2.length
  • s1 and s2 consist of only lowercase English letters.

 

해결 과정

  • s1, s2 문자열을 배열로 바꿔줄 arr1, arr2 를 선언하고, 다른 부분의 인덱스를 저장할 arr 배열을 선언한다.
  • for을 돌면서 s1와 s2의 요소들을 arr1, arr2 배열에 할당한다.
  • 두번째 for문을 돌면서 arr1, arr2가 다른 부분이 있다면 그 인덱스를 arr에 담는다.
  • 만약 arr의 길이가 0이면 다른 부분이 없는 것이기 때문에 true를 반환한다.
  • 만약 arr의 길이가 2라면 그 두 부분을 swap 했을 때 s1, s2가 같아지는지 확인해보아야 한다.
    • 다른 부분의 인덱스는 arr 배열이 갖고 있기 때문에, 다른 부분의 인덱스 값을 swap 해준다.
    • swap한 배열을 join한 문자열이 s2와 같다면 true를 반환한다.
    • 그렇지 않다면 false를 반환한다.
  • 길이가 0도 아니고 2도 아니면 바로 false를 반환한다.

 

해결 코드

/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
var areAlmostEqual = function(s1, s2) {
    // 전체 문자열에서 다른 부분은 두 개이다.
    // 두 개를 찾고 바꿨을 때 값이 같으면 true, 아니면 false
    
    let arr = [];
    let arr1 = [];
    let arr2 = [];
    
    for(let i = 0 ; i < s1.length ; i++){
        arr1.push(s1.charAt(i));
        arr2.push(s2.charAt(i));
    }
    
    for(let i = 0 ; i < s1.length ; i++){
        if(arr1[i] !== arr2[i]){
            arr.push(i);
        }
    }

    if(arr.length === 0) return true;    
    else if(arr.length === 2){
        [arr1[arr[0]], arr1[arr[1]]] = [arr1[arr[1]], arr1[arr[0]]];

        if(arr1.join("") === s2) return true;
        else return false;
        
    }
    else return false;
};