문제

 

풀이 코드

function solution(s, n) {
  let asciiCode = s.split('').map((ch) => {
    let asciiNum = ch.charCodeAt() + n;

    if (ch === ' ') return ch;
    return ch.toUpperCase().charCodeAt() + n > 90
      ? String.fromCharCode(asciiNum - 26)
      : String.fromCharCode(asciiNum);
  });
  return asciiCode.join('');
}

 

풀이 과정

어려웟다 아스키를 어떻게 사용해야할지 어떤 조건을 맞춰야 할지 한참을 생각했다.

풀이 과정은 다음과 같이 풀었다

 

1. asciiCode 라는 변수에 Ascii로 변환후, 다음 값을 계산해서 다시 문자로 저장했다.
2. Array.charCodeAt() 함수를 통해 해당 문자의 아스키 코드 값으로 변경할수 있다.
3. 일단, 해당 문자를 대문자로 변환한후, 변환된 문자의 아스키값에 n 만큼 더하여, 이 값이 90보다 크면 ( 'Z' 보다 크면 ) 26을 빼주어, 문자의 범위에서 계산되게 하고, 그렇지 않다면 문자 자체를 반환하게 했다.
4. 핵심은, 조건에서 대문자로 변환하여 이 값이 문자의 범위를 넘기는지 확인하고, 실제 계산할때는 대문자로 변환된 값으로 계산하면 안된다!!!
5. 마지막에 join 함수를 통해 문자열로 만들어 반환해 주었다.

 

다른사람의 풀이

function solution(s, n) {
    var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var lower = "abcdefghijklmnopqrstuvwxyz";
    var answer= '';

    for(var i =0; i <s.length; i++){
        var text = s[i];
        if(text == ' ') {
            answer += ' '; 
            continue;
        }
        var textArr = upper.includes(text) ? upper : lower;
        var index = textArr.indexOf(text)+n;
        if(index >= textArr.length) index -= textArr.length;
        answer += textArr[index];
    }
    return answer;
}

다른 사람은 아스키 코드를 안썻다

코드가 길긴 하지만, 이 코드가 훨씬 가독성 측면에서 좋다고 느껴졌다

 

배열을 이용한 구현이라니

문제

 

풀이 코드

let triadNum = [];

function solution(n) {
  let decimal = 0;
  setTriad(n);
  return triadNum
    .map((num, index) => num * 3 ** index)
    .reduce((sum, current) => sum + current, 0);
}

function setTriad(n) {
  if (n >= 3) {
    setTriad(n / 3);
    setTriad(n % 3);
  } else {
    triadNum.push(Math.floor(n));
  }
}

 

풀이 과정

42서울을 하며 진법변환을 위해 함수를 많이 만들었었다...

2진법, 16진법, 10진법 등등

그 아이디어가 생각나서 별도의 함수를 만들고 해당 함수에서 3진법으로 변환하게 하였다!

 

전역변수로 빈 배열을 선언한후, 해당 배열에 3진법으로 변환되는수 하나하나 추가했다

 

이후, map 함수를 통하여, 첫번째 인덱스부터 3 ** 0 , 3 ** 1 , ... 이렇게 된다 ( 문제에서 뒤집어 변환하기 라고 되어있다. )

처음에 요소를 뒤집었지만, 인덱스로 접근하면 굳이 뒤집지 않고 계산만 하면 된다고 생각이 들었다!!

 

그래서 reduce 함수로 각 요소를 더하여 해당 값을 반환하였다

근데 너무 코드가 지저분하다고 느껴졌다.

 

다른사람의 코드를 보고 경악을 금치 못했다

 

다른사람의 코드

const solution = (n) => {
    return parseInt([...n.toString(3)].reverse().join(""), 3);
}

이게 뭐지?

 

toString 함수로 진법 변환이 되는것도 신기한데

parseInt 함수를 이용해 진법 변환까지 가능하다

 

이래서 기초지식이 잘 파악되어야 한다

 

이부분은 나중에 다시 봐야겠다 특히 toString 과 parseInt 함수에 대해서

문제

 

풀이 코드

function solution(n) {
  let sortNum = n
    .toString()
    .split('')
    .sort((a, b) => a - b)
    .reverse()
    .join('');
  return parseInt(sortNum);
}

 

풀이 과정

함수를 이용하여 풀이 하였다.

각 단계별로 설명하면 다음과 같다.

1. toString 함수를 이용하여 문자열로 형 변환
2. split('') 함수를 이용하여, 각 요소를 나누어 배열 생성
3. sort() 함수를 이용하여, 각 요소를 정렬
4. reverse() 함수를 이용하여, 정렬된 요소를 반전
5. join() 함수를 이용하여, 배열의 요소들을 문자열로 생성
6. parseInt() 함수를 이용하여, 문자열을 정수로 변환하여 반환

 

이렇게 풀이하고나서 다른사람은 어떻게 풀었나 보았는데, 

sort()  함수의 인자를 비워놔도 정렬이 된다

 

결국 나는 sort 함수 내에 풀필요한 함수인자를 더 넣어줬다

 

이 부분만 빼면 나와 동일하게 푼것같다!

 

문제

 

풀이 코드

function solution(n) {
  let num = Math.sqrt(n);
  if (num == Math.floor(num)) return (num + 1) ** 2;
  else return -1;
}

 

풀이 과정

sqrt 함수를 이용하여, 제곱근을 구하고, 

floor 함수를 이용해 소수점 아래 수를 전부 버리고, 제곱근의 값과 같은지 비교하였다. 

이 과정에서 제곱근이 정수인지 판별할 수 있었고,

 

제곱근이 정수라면 다음수의 제곱근을 반환,

제곱근이 정수가 아니라면 -1 을 반환하게 하였다.

문제

 

풀이 코드

function solution(arr) {
  arr.splice(arr.indexOf(Math.min(...arr)), 1);
  return arr.length == 0 ? [-1] : arr;
}

 

풀이 과정

처음에 sort 를 하여, 0인덱스의 값을 제거했다.

이렇게 하고나서 문제를 다시보니 배열의 순서는 유지 되어야한다

 

그래서 Math.min 함수를 통해, 최소값이 있는 해당 인덱스를 구하여 , splice 함수를 적용했다,

단, 제거했을때 배열에 남는값이 없다면, ( 배열의 길이가 0 이라면 ) [-1] 을 return 하게 적용했다.

 

여기서도 Math.min 함수에 처음에 Math.min(arr) 로만 작성했지만, 테스트에서 Fail 되었다..

 

그래서 그 이유를 검색해보니 

Math.min  함수에 배열의 인자 하나하나 전달하기 위해서는 spread 를 사용해야 한다고 MDN 에 나와있었다!

+ Recent posts