[LeetCode]1544. Make The String Great - 자바스크립트 0609
https://leetcode.com/problems/make-the-string-great/
Make The String Great - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
이 문제에서 이렇게 애를 먹을 줄은 몰랐는데.. 애를 먹었다. 우선 이 문제의 예시에는 없지만 주의 해야할 케이스는,
1. 대문자가 앞에나오고 뒤에 소문자가 나오는경우
2. 대문자 소문자 소멸 뒤, 새로운 대문자 소문자 조합이 나오는 경우
이 두가지에 대해서 신경을 써야한다. 1번같은 경우는 그냥 문제를 제대로 읽었다면 그냥 신경 쓸수 있는 케이스이지만, 2번같은경우에는 체크하고있는 index에 신경을 써야한다.
문제풀이
1. 대문자 소문자 구분방법
s[i].charCodeAt()을 활용하여 a, A,z,Z를 각각 구하여 대문자 소문자 범위를 구한다. console.log로 구했다 대문자 같은경우 65에서 90이 범위이다
const cca = s[i].charCodeAt()
if (cca >= 65 && cca <= 90) {
}
2. 대문자가 앞에 있는경우, 대문자가 뒤에 있는경우
if (s[i].toLowerCase() === s[i - 1]) {
} else if (s[i].toLowerCase() === s[i + 1]) {
}
3. 그 문자들을 삭제
if (s[i].toLowerCase() === s[i - 1]) {
s = s.slice(0, i - 1) + s.slice(i + 1)
i -= 3
} else if (s[i].toLowerCase() === s[i + 1]) {
s = s.slice(0, i) + s.slice(i + 2)
i -= 2
}
i를 3 그리고 2를 빼준 이유는, 문자를 삭제하면서 새로운 삭제 가능성이 있는 문자가 있는지 검색을 하기 위해서이다. 하지만, 이렇게 실행하면 어떤 문자같은 경우에는 index에 undefined가 발생하여 에러가 발생할 수 있다. 이 에러가 발생하는 조건은 i가 0보다 작을 때이기 때문에, for문 안에 거대한 조건을 넣어준다
if (i >= 0) {
}
전체 풀이식
var makeGood = function (s) {
for (let i = 0; i < s.length; i++) {
if (i >= 0) {
const cca = s[i].charCodeAt()
if (cca >= 65 && cca <= 90) {
if (s[i].toLowerCase() === s[i - 1]) {
s = s.slice(0, i - 1) + s.slice(i + 1)
i -= 3
} else if (s[i].toLowerCase() === s[i + 1]) {
s = s.slice(0, i) + s.slice(i + 2)
i -= 2
}
}
}
}
return s
};
사실 인덱스에서 문제가 생기는 경우는 상당히 많이 만난 이슈인데 항상 해결 방법을 몰라서 i의 범위를 잡느라 쩔쩔 맨경우가 있었는데, 이와 같이 i를 조건을 걸어버리면 된다는 아이디어를 얻게되었다!