문제
우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.
해결 과정
이 문제를 보고 처음 든 생각은 이중for문으로 해결해야겠다입니다.
function solution(age) {
var answer = '';
for(let i = 1; i<9; i++) {
for(let j ='a'; j<'j'; j++){
answer == age;
return console.log(answer);
}
}
}
막상 이렇게 이중for문으로 적었지만 왜 이걸 사용했는지 정작 생각을 안들었다.
그래서 라미개발자 #8 프로그래머스 Lv0 자바스크립트로 풀기 Day 08을 참고했다.
function solution(age) {
var answer = '';
// 1. 숫자를 문자형으로 바꾸기
const ageString = String(age);
// 2. while문 통해서 반복하기
let cnt = 0; // 이걸 통해서 while문에서 사용하는 ageString 순회값 저장
while(cnt < ageString.length) {
// cnt 보다 작아야지 while문이 작동
if(ageString[cnt] === '0') {
// ageString[cnt]를 작성한 이유는 [cnt]가 즉 배열의 순서를 의미하기에
answer+= 'a'; // answer에 값 저장
}
if(ageString[cnt] === '1') {
answer+= 'b';
}
if(ageString[cnt] === '2') {
answer+= 'c';
}
if(ageString[cnt] === '3') {
answer+= 'd';
}
if(ageString[cnt] === '4') {
answer+= 'e';
}
if(ageString[cnt] === '5') {
answer+= 'f';
}
if(ageString[cnt] === '6') {
answer+= 'g';
}
if(ageString[cnt] === '7') {
answer+= 'h';
}
if(ageString[cnt] === '8') {
answer+= 'i';
} if(ageString[cnt] === '9') {
answer+= 'j';
}
cnt ++; // 이걸 작성해야 무한 반복 막을 수 있음
}
return answer;
}
하지만 위에와 같이 작성한 걸 1~2줄로 요약할 수 있다.
이것도 물론 영상을 보고 안거다. 하지만 따라치지 않았다. 이번에는 직접 구글링해서 찾아서 풀어볼 예정이다. (스스로 해결하기 실패,,, 다시 라미개발자 영상 참고해서 코드리뷰할 예정이다.)
// ✌🏻 두번째 방법
function solution(age) {
var answer = '';
const ageString = age.toString();
var cnt = 0;
while (cnt < ageString.length) {
answer += String.fromCharCode(ageString[cnt].charCodeAt(0) + 49);
cnt++;
}
return answer;
}
코드를 이해하는데 시간이 꽤 걸렸다. 일단 저 코드를 이해하려면 아스키코드 이미지가 필요하다.
저 코드를 따라쳐보고 궁금한게 생겼다. 왜 charCodeAt()안에 0을 작성해야하는지,
왜 49를 더해야하는지에 대한 궁금증이 생겼다.
49를 더하는 이유는 아스키 코드 이미지를 보면 이해할 수 있다.
나는 a를 출력하고 싶다. 이때 숫자 0을 살펴보자
숫자 0은 48에 있다. 여기서 48에 49를 더해야 a가 나온다. 즉, 내가 원하는 문자열 값을 얻기 위해 49가 나왔다.
문득 이 코드를 풀다가 궁금한게 또 생겼다. (어쩌면 헷갈리는거이긴하다.)
String과 toString의 차이점에 대해서이다.]
String은 전역 객체이다. 이제 문자열의 생성자인것이고
toString은 문자열을 반환하는 Object의 대표적인 방법이다.
여기서 추가로 전역 객체란 무엇일까? Object란 무엇일까? 에 대한 개념을 정리해 보려 한다.
전역 객체
모든 객체의 최상위 객체웹 브라우저에서는 window, Node.js에서는 global이다.
새롭게 알게된 점📝
fromCharCode에 대한 설명이다.
즉, 이건 utf-16 코드 유닛의 시퀀스로부터 문자열을 생성해 반환한다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode
charCodeAt 메서드를 사용할때는 0부터 사용해야한다. 그래야 문자열의 길이보다 하나 작은값까지 유효할 수 있다.
정답
// 👆🏻 첫번째 방법
// function solution(age) {
// var answer = '';
// // 1. 숫자를 문자형으로 바꾸기
// const ageString = String(age);
// // 2. while문 통해서 반복하기
// let cnt = 0; // 이걸 통해서 while문에서 사용하는 ageString 순회값 저장
// while (cnt < ageString.length) {
// // cnt 보다 작아야지 while문이 작동
// if (ageString[cnt] === '0') {
// // ageString[cnt]를 작성한 이유는 [cnt]가 즉 배열의 순서를 의미하기에
// answer += 'a'; // answer에 값 저장
// }
// if (ageString[cnt] === '1') {
// answer += 'b';
// }
// if (ageString[cnt] === '2') {
// answer += 'c';
// }
// if (ageString[cnt] === '3') {
// answer += 'd';
// }
// if (ageString[cnt] === '4') {
// answer += 'e';
// }
// if (ageString[cnt] === '5') {
// answer += 'f';
// }
// if (ageString[cnt] === '6') {
// answer += 'g';
// }
// if (ageString[cnt] === '7') {
// answer += 'h';
// }
// if (ageString[cnt] === '8') {
// answer += 'i';
// }
// if (ageString[cnt] === '9') {
// answer += 'j';
// }
// cnt++; // 이걸 작성해야 무한 반복 막을 수 있음
// }
// return answer;
// }
// ✌🏻 두번째 방법
function solution(age) {
var answer = '';
const ageString = age.toString();
var cnt = 0;
while (cnt < ageString.length) {
answer += String.fromCharCode(ageString[cnt].charCodeAt(0) + 49);
cnt++;
}
return answer;
}
https://school.programmers.co.kr/learn/courses/30/lessons/120834
'⌨️ 프로그래머스 > 코딩테스트 입문' 카테고리의 다른 글
[프로그래머스] 순서쌍의 개수 | JS (0) | 2024.06.03 |
---|---|
[Programmers] 진료순서 정하기 🏥 | JS (0) | 2024.06.03 |
[프로그래머스] 짝수의 합 ➕ (0) | 2024.02.27 |
[프로그래머스] 각도기 📐 (0) | 2024.02.23 |
[프로그래머스] 특정 문자 제거하기 (0) | 2024.02.23 |