알고리즘/항해99

99클럽 코테 스터디 30일차 TIL + 문자열(Minimum Suffix Flips)

IamBD 2024. 6. 18. 19:47

오늘의 과제

리트코드 medium으로 분류된 Minimum Suffix Flips 입니다.

 

이번 유형은 문자열 입니다.

문제

https://leetcode.com/problems/minimum-suffix-flips/description/

 

 

먼저 문제 요구사항 요약입니다.

 

모두 0인 이진 문자열이 있다고 가정하고 이 문자열을 target의 이진 문자열과 일치 시키려면 몇 번의 flip을 해야하는지 반환하면 되는 문제입니다.

 

문제만 이해하면 이번에도 굉장히 간단히 풀 수 있는 문제입니다.

 

먼저 반환할 answer 값과 뒤집어야할지 결정할 flip 변수를 선언합니다. 이후에는 주어진 target 문자열을 순회하며 flip 값과 target char 값을 비교하며 뒤집어주면 됩니다.

 

문제 조건에 보면 i번을 선택하면 그 뒤로는 한 번에 뒤집을 수 있다고 나와있으니 우리는 그냥 이미 뒤집은건 신경쓰지 않고 쭉 밀고 나가면 최적의 해를 찾을 수 있습니다.

 

핵심 검증 코드입니다.

for (char c : target.toCharArray()) {
    if (c != flip) {
        answer++;
    }
    flip = c;
}

 

 

문제의 예시로 같이 살펴보겠습니다.

 

target = "10111"

str = "00000"

flip = '0'

 

저희는 비교할 초기값을 0으로 셋팅 후 진행하겠습니다. 처음에 1을 만났으니 한 번 뒤집고 다음 값을 뒤집어야 할 지 검증해야 하기 때문에 flip 값을 이번 값으로 업데이트 해주겠습니다.

 

str = "11111"

flip = '1'

 

target의 다음 c 값은 '0'으로 또 flip의 '1'과는 다르기에 다시 뒤집어줍니다.

 

str = "10000"

flip = '0'

 

target의 다음 c 값은 '1'으로 또 flip의 '0'과는 다르기에 다시 뒤집어줍니다.

 

str = "10111"

flip = '1'

 

이미 str이 target과 동일해졌으니 값을 반환하면 됩니다. 총 세 번 뒤집었으니 3을 반환하면 되겠죠?

(00000 => 11111 => 10000 => 10111)

 

 

코드입니다.

class Solution {
    public int minFlips(String target) {
        int answer = 0;
        char flip = '0';

        for (char c : target.toCharArray()) {
            if (c != flip) {
                answer++;
            }
            flip = c;
        }

        return answer;
    }
}

 

 

배운 점

오래 생각하지 않고 힌트를 먼저 보는 습관이 생겼으며 다양한 생각이 아닌 문제의 분류로 주어진 힌트에 집착하기 시작했습니다. 단기적으로 봤을 땐 많은 문제를 풀 수 있게 되겠지만 왜? 라는 사고력은 키워지지 않을 것 같아 좋은 습관은 아닌 것 같네요. 조금은 시간이 더 걸리더라도 혼자 고민하고 답을 도출해내는 연습을 해야겠습니다.

 

 

 

 

오늘의 한줄평

빠른 일처리도 중요하지만 한 발 물러나 보면 다른 해답도 보일 수 있다.