목차

오늘의 학습 키워드

공부한 내용 정리

오늘의 회고

오늘의 학습 키워드

문자열

공부한 내용 정리

문제는 다음과 같다

Untitled

어떠한 요령이나 알고리즘이 있는 것이 아니라, 문자가 바뀔 때마다 flip을 진행하면 된다.

따라서 맨 처음에는 문자열을 전체 순회하며 연속된 문자를 삭제한 후, 길이를 반환하도록 하였다. 예를 들면, “10111” 문자열을 “101“로 바꾸고, 3을 return하는 것이다.

    public int minFlips(String target) {

        StringBuilder sb=new StringBuilder(target);

        for (int i=1;i<sb.length();i++){
            if (sb.charAt(i-1)==sb.charAt(i)){
                sb.deleteCharAt(i);
                i--;
            }
        }
        if (sb.charAt(0)=='0') return sb.length()-1;
        else return sb.length();
    }

위와 같이 작성했더니 시간이 174ms가 나왔다.

다시 생각해보니 어차피 전체 문자열을 순회할거면 굳이 중복을 없앤 새 문자열을 생성할 필요 없이 숫자가 바뀔 때마다 값을 증가시킨 후 반환하면 될 것이었다.

    public int minFlips(String target) {
        int flips=0;
        if (target.charAt(0)=='1') flips++;
        for (int i=1;i<target.length();i++){
            if (target.charAt(i)!=target.charAt(i-1)) flips++;
        }
        return flips;
    }

위 코드는 훨씬 줄었지만 평균에 비해 한참 못 미치는 성능(9ms)을 보였다.

Untitled

오늘의 회고

결국 solutions를 참고하게 되었는데, 그 중 사람들이 가장 많이 작성한 코드는 다음과 같다.

class Solution {
    public int minFlips(String target) {
        int c=0;
        char flag='0';
        for(char ch:target.toCharArray())
        {
            if(ch!=flag)
            {
                c++;
                flag=ch;
            }
        }
        return c;
    }
}