문제

 

풀이 코드

function solution(s) {
  let str = '';
  str = s
    .split(' ')
    .map((item) =>
      item
        .split('')
        .map((st, index) =>
          index % 2 == 0 ? st.toUpperCase() : st.toLowerCase()
        )
        .join('')
    )
    .join(' ');
  return str;
}

 

풀이 과정

문제를 보자마자 split 으로 나누고, map 을 통해 구현하고, join 으로 다시 문자열을 합치면 된다는 생각이 들었다.

풀이 단계를 설명하면 다음과 같다

1. 입력된 문자열 s 를 공백( ' ' ) 기준으로 나눈다.
2. 나뉘어진 문자열은 배열로 공백을 기준으로 배열로 저장된다. 해당 배열을 map 함수로 보낸다.
3. 첫번째 map 함수에서, 또 다시 각 배열의 요소를 한글자씩 나누어 배열로 저장한다.
4. 한글자씩 나뉘어진 요소들의 인덱스가 짝수이면 대문자로 변환, 홀수이면 소문자로 변환하여 반환한다.
5. 반환된 배열의 요소들을 다시 join 함수로 문자열로 만든다.
6. 각 배열 인덱스에 변환된 문자열들을 하나의 문자열로 다시 join 을 이용해 만들어 반환한다

 

다른사람의 코드

function toWeirdCase(s){
  return s.toUpperCase().replace(/(\w)(\w)/g, function(a){return a[0].toUpperCase()+a[1].toLowerCase();})
}

훨씬 간단하게 구현 하셨다

정규식을 이용한 풀이라니 많이 배워간다!

문제

 

풀이 코드

function solution(n) {
  let str = '';
  for (let i = 0; i < n; i++) {
    str += i % 2 === 0 ? '수' : '박';
  }
  return str;
}

 

풀이 과정

인덱스로 접근하여, 짝수면 '수' 를, 홀수면 '박' 을 문자열에 추가시키는 방법으로 구현했다.

 

다른사람의 코드

function waterMelon(n){
  var result = "수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박"
  //함수를 완성하세요

  return result.substring(0,n);
}

이건 너무 웃겨서 가져와 봤다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

아니근데 n은 10000 이하 수인데 이걸 어떻게 통과하신거짘ㅋㅋㅋㅋ 테스트 케이스가 10000까진 안가나보다 ㅋㅋㅋ

문제

 

풀이 코드

function solution(n) {
  if (n === 0) {
    return 0;
  }

  let prime = [];

  if (n % Math.sqrt(n) === 0) {
    prime.push(Math.sqrt(n));
  }
  for (let i = 1; i < Math.sqrt(n); i++) {
    if (n % i === 0) {
      prime.push(i);
      prime.push(n / i);
    }
  }
  return prime.reduce((sum, num) => sum + num, 0);
}

 

풀이 과정

약수를 구하는 문제.. 아.. 확실히 PS 문제를 풀다보니까 42Seoul 이 도움이 된다.

 

해당 문제 그냥 n 까지 1씩 더해서 다~~ 구했었는데

 

42서울에서 시간초과가 나서 고민을 많이 하다 발견한게 제곱근을 이용한 풀이였다.

 

제곱근까지만 구하고, 구해진 약수와, n 을 약수로 나눈 몫, 그리고 제곱근 만 구해주면 시간적 측면에서 엄청난 단축을 할수 있다.

 

예를들어.. 3000 이라고 치면

1, 2, 3, 4, 5,,...100,101,102...2000,2001,2002...2999,3000

이렇게 하나하나 나누어 가며 나머지가 0인놈들을 선별해야 하지만

 

제곱근을 이용하면 54 까지만 비교하고, 

54까지의 약수들과, N을 해당 약수로 나눴을때 몫, 그리고 N을 해당 제곱근으로 나눴을때 나머지가 0이라면 이 값들만 계산하면 된다

 

따라서 시간복잡도 성능 업업!!

 

이렇게 약수들을 더해 배열에 넣고,

reduce 고차함수를 통하여 약수들을 싹 더해줬다

 

 

다른사람의 코드

function solution(n, a=0, b=0) {
    return n<=a/2?b:solution(n,a+1,b+=n%a?0:a);
}

3항 연산자를 중첩으로 이용하고, 재귀함수를 이용하려 푸셨다.

 

근데 가독성이 너무 떨어져서 굳이 이렇게 풀어야 하나 싶다.

 

한줄로 깔끔하게 짠건 참신하다는 생각이 든다!

문제

 

풀이 코드

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 함수에 대해서

+ Recent posts