- 포인터다. 정말 생소하디 생소한, 버퍼에서나 사용해봤던 그 포인터.
- 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 |