문제 설명
문자열을 입력으로 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 다음과 같은 과정을 거쳐야 합니다.
먼저 문자열의 각 문자를 해당하는 ASCII 문자 코드로 변환한 뒤, 이 코드들을 모두 이어 붙여 하나의 큰 숫자를 만듭니다. 다음으로 이 숫자에서 등장하는 모든 7을 1로 바꿔 또 다른 숫자를 만듭니다. 마지막으로 원래 숫자와 변경된 숫자의 차이를 반환하면 됩니다.
접근 방법
두 숫자의 자릿수 구성은 7이 있던 위치만 달라질 뿐 완전히 동일합니다. 따라서 실제로 거대한 숫자를 만들 필요 없이, ASCII 코드에서 등장하는 7의 개수만 세면 됩니다.
7 하나가 1로 바뀔 때마다 해당 자릿값은 정확히 6씩 줄어듭니다. 예를 들어 7이 십의 자리에 있다면 70 → 10이 되어 60의 차이가 발생하고, 일의 자리라면 7 → 1로 6의 차이가 발생합니다. 결국 (7의 개수) × 6이 곧 두 숫자의 차이가 됩니다.
예제 코드
const str = 'AVEHDKDDS';
const ASCIIDifference = (str = '') => {
return str
.split('') // 문자열을 개별 문자 배열로 분리
.map(c => c.charCodeAt(0)) // 각 문자를 ASCII 코드로 변환
.join('') // 코드들을 이어 붙여 하나의 숫자 문자열 생성
.split('') // 다시 한 글자씩 분리
.map(Number) // 각 자릿값을 숫자로 변환
.filter(d => d === 7) // 7인 자릿값만 추출
.length * 6; // 7의 개수 × 6 = 두 숫자의 차이
};
console.log(ASCIIDifference(str));
출력 결과
12
코드 설명
문자열 'AVEHDKDDS'의 각 문자를 ASCII 코드로 변환하면 A(65), V(86), E(69), H(72), D(68), K(75), D(68), D(68), S(83)이 되고, 이를 이어 붙이면 658669726875686883이라는 숫자가 됩니다.
이 숫자에는 7이 두 번 등장하므로, 7을 모두 1로 바꾸면 총 차이는 2 × 6 = 12가 됩니다. 이처럼 실제로 숫자를 치환하지 않고도 7의 개수만 세어 효율적으로 답을 구할 수 있습니다.