막무가내로 삽질하는 알고리즘

Longest Substring With At Most Two Distinct

Jungsoomin :) 2020. 10. 26. 00:29
  • 포인터다. 정말 생소하디 생소한, 버퍼에서나 사용해봤던 그 포인터.
  • Map을 선언하여 문자와 포인터에 걸린 문자수를 저장한다.
  • if문으로 가져온 값이 1이라면 새로운 문자를 넣은 것이므로 counter 는 증가
  • 길이 추출을 위해 end 포인터를 증가 시킴
  • 새로운 글자 추출로 인해 count 가 허용한 2를 넘어갈시에 start 포인터의 글자만큼 map에서 수를 삭감
  • 한글자가 모두 삭감되었을때 count-- 삭감되는 동안 start 포인터는 기준점을 옮기기 위해 증가함
  • 매번 length 를 max 함수로 구하므로 포인터로 잡은 최대 length는 변수에 언제나 저장되어 있음.
public class LongestSubstringWithAtMostTwoDistinctRepeat {
    public static void main(String[] args) {
        String input = "eceba";
        String input1 = "ccaabbb";

        solve(input1);
    }

    private static void solve(String input1) {
        Map<Character, Integer> map = new HashMap<>();
        int start = 0, end = 0, counter = 0, length = 0;

        while (end < input1.length()) {
            // end 포인터의 글자
            char endChar = input1.charAt(end);
            map.put(endChar, map.getOrDefault(endChar, 0) + 1);
            // 맵에 글자가 처음 들어갔니?
            if (map.get(endChar) == 1) {
                counter++;
            }
            // end 포인터 이동
            end++;
            while (counter > 2) {// 허용한 글자를 넘어섰을 경우 start 포인터를 글자 하나를 지울만큼 이동시켜야함
                char startChar = input1.charAt(start);
                map.put(startChar,map.get(startChar) -1);
                if(map.get(startChar) == 0){
                    counter --;
                }
            }
            //거리를 항상 측정하여 기존 length 와 비교시킨다. 이렇게 되면 항상 max 값의 길이만을 얻을 수 있다.
            length = Math.max(length, end - start);
        }
        System.out.println(length);
    }
}

 

 

친구와 같이 파악하면서...눈돌아가는 듯 했다. 참 대단한 분이시다...하고 놀래고 있다.

'막무가내로 삽질하는 알고리즘' 카테고리의 다른 글

Find Anagrams Mapping  (0) 2020.11.03
MaximumSubArray  (0) 2020.11.03
UniqueEmailAddresses  (0) 2020.10.25
PlusOne  (0) 2020.10.25
KClosest  (0) 2020.10.25