Post

leetcode(리트코드)-1247 Minimum Swaps to Make Strings Equal(PYTHON)

leetcode 1247 - Minimum Swaps to Make Strings Equal 문제입니다.

1. 문제

https://leetcode.com/problems/minimum-swaps-to-make-strings-equal/


2. Input , Output


3. 분류 및 난이도

Medium 난이도 문제입니다.


4. 문제 해석

  • ‘x’와 ‘y’로 이루어진 두개의 문자열이 들어옵니다.
  • 두 문자를 스왑할 수 있을 때 가장 적게 스왑하여 두 문자를 같게 만들어야합니다.
  • 그 수를 리턴하세요.

5. code

코드설명

  • s1이 ‘xxxxxyyy’라고 하고, s2가 ‘yyyyyxxx’라고 하면 s1기준으로 x가 다른부분은 5개 y가 다른 부분은 3개입니다.
  • 이 총합이 짝수가 아니면 -1을 리턴해야합니다. 만약 홀수라면 둘 중 하나의 갯수가 홀수라는 것인데, 그러면 두 글자를 절대 맞춰줄 수 없기 때문입니다.
  • x기준으로 swap을 해줍니다. 위의 예제에서 ‘xxxxx’인데 일단 홀수개 이므로 s1의 ‘xxxx’와 s2의 ‘yyyy’만 바꿔줍니다.(xcount // 2 코드)
  • 그 결과 ‘xyxyxyyy’가 되고, s2는 ‘xyxyyxxx’가 됩니다.
  • 마찬가지로 y를 기준으로 바꿔줍니다. s1에서 ‘yyy’입니다. (ycount // 2 코드)
  • 그 결과 ‘xyxyxyxy’가 되고, s2는 ‘xyxyyxxy’가 됩니다.
  • 다른부분은 s1의 ‘xy’와 s2의 ‘yx’가 되는데, 이는 특별한 경우로 swap을 2번 진행해줘야합니다. 이 경우는 x의 기준으로든 y의 기준으로든 홀수인 경우에만 나타납니다. (xcount%2 == 1 : 코드 x기준으로)

python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
    def minimumSwap(self, s1: str, s2: str) -> int:
        xcount = 0 
        ycount = 0 
        res = 0 
        for i in range(len(s1)) : 
            if s1[i] != s2[i] : 
                if s1[i] == 'x' : 
                    xcount += 1
                else :
                    ycount += 1
        # 두문자의 다른부분이 홀수인 경우 -1
        if (xcount + ycount) % 2 == 1: 
            return -1
        else : 
            #맞춘 상태에서 시작
            res = (xcount // 2) + (ycount // 2) 
            if xcount %2 == 1 : 
                res += 2
        return res
        

6. 결과 및 후기, 개선점

필요시 c++로 짜드립니다.

설명이 필요하다면 댓글을 달아주세요.

This post is licensed under CC BY 4.0 by the author.