Algorithm
Leetcode 2843. Count Symmetric Integers
KANG_G1
2024. 6. 4. 23:07
low와 high에서 대칭되는 값이 몇 개인지 구하는 문제였습니다.
가장 먼저 고려했던 것은 대칭 유무를 어떻게 구분하는 것인가였는데요.
example 2를 보며 유사성을 찾았습니다.
Example 2:
Input: low = 1200, high = 1230
Output: 4
Explanation: There are 4 symmetric integers between 1200 and 1230: 1203, 1212, 1221, and 1230.
숫자를 중간을 기준으로 나눠 왼쪽값과 오른쪽 값이라고 예를 들었을 때,
왼쪽 값의 합과 오른쪽 값의 합은 같다는 특징이 있었어요.
low부터 high의 수를 어떻게 나누고 값으로 산출해내느냐가 관건이었습니다.
문제 접근
1) 주어진 수의 범위가 넓어 for문을 사용하는 것이 맞는건가 싶었는데
가장 익숙한 방법이기에 for문을 사용해줬고,
low부터 high 범위의 수를 문자열로 변환해 각 요소에 접근했습니다.
2) 코드를 작성하다보니 for문 내부에서 여러 코드가 작성되니
복잡해지기 시작해 value의 역할을 수행하는 함수로 분리했어요.
3) left 값과 right 값을 구분하는 방법은 여러 가지가 있었겠지만
문자열의 length를 2로 나누어 처리하는 것으로 해결했습니다.
4) 내부 for문을 순회하며 left값의 합과 right값의 합을 비교해
서로의 합이 같다면 논리적 and 연산자인 &&를 사용해
1을 return 해줬는데요, 이 부분은 삼항 연산자로 풀어도 되겠다 싶었습니다.
하지만 삼항 연산자로 접근했을 때의 런타임이 좀 더 느려서
저는 &&로 접근하기로 했어요.
제출 코드
/**
* @param {number} low
* @param {number} high
* @return {number}
*/
const isSymmetric = (num) => {
const str = String(num);
const length = str.length;
if(length === 1) return 0;
let leftNum = 0, rightNum = 0;
for(let i=0; i<length/2; ++i) {
leftNum += (+str[i]);
rightNum += (+str[length/2+i]);
}
return leftNum === rightNum && 1;
}
var countSymmetricIntegers = function(low, high) {
let count = 0;
for(let i=low; i<=high; ++i) {
count += isSymmetric(i);
}
return count;
};