⌨️ 프로그래머스/코딩테스트 입문

[프로그래머스] 외계행성의 나이 👽 | JS

하나둘세현 2024. 5. 31. 00:46
728x90

문제

우주여행을 하던 머쓱이는 엔진 고장으로 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

 

String.fromCharCode() - JavaScript | MDN

String.fromCharCode() 메서드는 UTF-16 코드 유닛의 시퀀스로부터 문자열을 생성해 반환합니다.

developer.mozilla.org

 

charCodeAt 메서드를 사용할때는 0부터 사용해야한다. 그래야 문자열의 길이보다 하나 작은값까지 유효할 수 있다.

https://yari-demos.prod.mdn.mozit.cloud/ko/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt

 

String.prototype.charCodeAt() - JavaScript | MDN

charCodeAt() 메서드는 주어진 인덱스에 대한 UTF-16 코드를 나타내는 0부터 65535 사이의 정수를 반환합니다.

yari-demos.prod.mdn.mozit.cloud

 

정답

// 👆🏻 첫번째 방법

// 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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

728x90