문제

 

풀이 코드

function solution(seoul) {
    return `김서방은 ${seoul.indexOf("Kim")}에 있다`
}

 

풀이 과정

설명이 필요 없을것으로 예상되는 문제다

 

` ` 사이에 변수를 사용할수 있다는것!

Array.indexOf() 로 인덱스를 찾을수 있다는것!

 

두가지만 알면 될거같다!

문제

 

풀이 코드

function solution(n) {
  let numArr = new Array(n).fill(1);
  for (let i = 2; i * i <= n; i++)
    for (let j = i * i; j <= n; j += i) numArr[j - 1] = 0;
  return numArr.reduce((sum, item) => sum + item, 0) - 1;
}

 

풀이 과정

어려운 문제였다 혼자 해결을 못하고 구글링을 통해 개념을 숙지했다

역시 나는 한참 부족하다

 

일단 소수찾는 알고리즘으로 에라토스테네스의 체 라는 개념을 알고 있어야 한다.

https://ko.wikipedia.org/wiki/에라토스테네스의_체

 

정말 간단히 설명하면 다음과 같다.

 

1. 소수가 아닌 수는 배수로 이루어진다.

2. 배수를 제거하면 남는 수들이 결국 소수가 된다.

 

이 개념을 바탕으로, 코드를 참고하여 작성하였다.

 

코드의 순서는 다음과 같다.

1. 우선, n 크기의 배열을 생성하고, 해당 배열에 fill 함수를 통하여 모든 요소를 1로 세팅한다.
2. 이전에 약수를 구하는 알고리즘과 마찬가지의 이유로, 모든 수를 비교 하는것은 시간적으로 너무 많이 낭비된다, 이를 해결하기 위해 제곱근으로 비교하며 for 루프를 돈다.
3. 순회 할때마다, 해당수의 배수에 해당하는 요소들의 인덱스를 0으로 설정한다. ( j - 1 )을 하는 이유는 인덱스는 0부터 시작하기 때문.
4. 그렇게 모든 수 까지 순회하고 나면, 소수가 위치한 인덱스만 1이된다.
5. reduce 함수를 이용해 모든 요소를 더해주면 소수의 갯수가 될것이다.
6. 단, 여기에는 1 도 포함되지만, 1은 소수가 아니므로 1을 빼준다.

문제

 

풀이 코드

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항 연산자를 중첩으로 이용하고, 재귀함수를 이용하려 푸셨다.

 

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

 

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

+ Recent posts