카테고리 없음
[못품/릿코드/javascript] 424
_서리__
2023. 4. 4. 08:32
var characterReplacement = function(s, k) {
//k번만 교환가능하다.(다른 uppercase로.. 즉 k번까지는 제외하고, 가장 길게 연속되어있는 문자열을 구하면 됨.!)
//가장 긴 연속된 것들을 구해라.
// A A B A B B A
//left는 obj[left] = > 연속된 글자.
//이제 근데 k개는 교환할 수 있으니까 k개는 있다치고 넘어감.
//즉 obj[left] => s[left]===s[right]일때 늘어나고, 아닐때도 k개까지는 늘어남.
//더이상 늘어날 수 없다면(k개 목숨 다썼다면) left++ 해줌.
//그 다음 obj[left]를 구함. right은 left+1로 바뀜. 그리고 obj중에 제일 큰 숫자 반납하면 됨.
let obj = {};
let count = 0;
let left=0,right=0;
while(left<s.length){
if(!obj[left]) obj[left] = 0;
obj[left]++;
right++
if(s[left]!==s[right]) count++;
if(count>k||right>=s.length) {
left++
right = left
count=0
}
}
let max = 0;
for(let key in obj){
max = Math.max(max,obj[key])
}
return max
};
내가 처음 풀었던 코드.
left와 right을 이용해서 그 사이의 길이를 측정했다 k번까지는 달라도 그냥 넘어갔음
근데 이렇게 풀면 ABBB의 답이 3이 나오는 불상사가 발생한다.
const characterReplacement = (s, k) => {
let left = 0;
let right = 0;
let maxCharCount = 0;
const visited = {}
while(right<s.length){
let char = s[right];
visited[char] = visited[char] ? visited[char] + 1 : 1;
if(visited[char]>maxCharCount) maxCharCount = visited[char]
if(right-left+1-maxCharCount>k){
visited[s[left]]--;
left++;
}
right++;
}
return right-left
};
다른 사람의 풀이
나와의 차이점은
1. 나는 인덱스로 객체에 저장했지만 알파벳으로 객체에 저장하였다.
2. A===B일경우에 객체에 저장하는게 아니라 right은 일단 카운트하고, 제일 많이나온 알파벳을 maxCharCount에 저장한다.
-> 이렇게 하면 ABBB같은경우에도 대응이 가능!
3.객체나 maxCharCount를 반환하는 것이 아니라 windowSize를 반환하였다.
right-left+1-maxCharCount 라는 것은 right과 left사이에 교환해야할 것이 k보다 큰가? 하는 물음이다. 그럴경우에 left를 줄여줘서 사이즈를 줄여준다.