Algorithm/programmers

Programmers Level 1 연습문제모음 ( JavaScript )

takeU 2021. 7. 14. 17:17
반응형

Level 1 연습문제 ( JavaScript )

작성한 코드보다 더 좋은 코드가 있음을 미리 알려드리며,

코드의 해설이 필요하신 분은, 댓글 남겨주시면 적어놓겠습니다.

 

목차

  1. 직사각형 별찍기
  2. x만큼 간격이 있는 n개의 숫자
  3. 행렬의 덧셈
  4. 핸드폰 번호 가리기
  5. 하샤드 수
  6. 평균 구하기
  7. 콜라츠 추측
  8. 최대공약수와 최소공배수
  9. 짝수와 홀수
  10. 제일 작은 수 제거하기
  11. 정수 제곱근 판별
  12. 정수 내림차순으로 배치하기
  13. 자연수 뒤집어 배열로 만들기
  14. 자릿수 더하기
  15. 이상한 문자 만들기
  16. 약수의 합
  17. 시저 암호
  18. 문자열을 정수로 바꾸기
  19. 수박수박수박수박수박수?
  20. 소수 찾기
  21. 서울에서 김서방 찾기
  22. 문자열 다루기 기본
  23. 문자열 내림차순으로 배치하기
  24. 문자열 내 p와 y의 개수
  25. 문자열 내 마음대로 정렬하기
  26. 두 정수 사이의 합
  27. 나누어 떨어지는 숫자 배열
  28. 같은 숫자는 싫어
  29. 가운데 글자 가져오기
  30. 2016년

 

풀이

1. 직사각형 별찍기

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
    console.log(('*'.repeat(a) + '\n').repeat(b));
});

2. x만큼 간격이 있는 n개의 숫자

function solution(x, n) {
    return Array(n).fill(x).map((a,i) => a+x*i)
}

3. 행렬의 덧셈

function solution(arr1, arr2) {
    return arr1.map((a,i) => a.map((b,j) => b + arr2[i][j]));
}

4. 핸드폰 번호 가리기

function solution(phone_number) {
    return `${"*".repeat(phone_number.length-4)}${phone_number.slice(-4)}`
}

5. 하샤드 수

function solution(x) {
    return !( x % (''+x).split('').reduce((a,b) => +a + +b) );
}

6. 평균 구하기

function solution(arr) {
     return arr.reduce((a,b) => a+b)/arr.length
}

7. 콜라츠 추측

function solution(num) {
   let count = 0;
    while ( num !== 1 ) {
        if ( count === 500 ) return -1;
        count++;
        num = num % 2 ? num*3+1 : num/2
    }
    return count;
}

8. 최대공약수와 최소공배수

function solution(n, m) {
    let gcd = 1;
    for ( let i = 1; i <= Math.min(n,m); i++ ) {
        if ( !(n%i) && !(m%i) ) gcd = i
    }
    return [gcd, n*m/gcd]
}

9. 짝수와 홀수

function solution(num) {
   return num % 2 ? "Odd" : "Even"
}

10. 제일 작은 수 제거하기

function solution(arr) {
    const idx = arr.indexOf(Math.min(...arr))
    return arr.length > 1 ? [...arr.slice(0,idx), ...arr.slice(idx+1)] : [-1]
}

11. 정수 제곱근 판별

function solution(n) {
  return Number.isInteger(n ** 0.5) ?
      (n ** 0.5 +1) ** 2 : -1
}

12. 정수 내림차순으로 배치하기

function solution(n) {
    return +(''+n).split('').sort((a,b) => +b - +a).join('')
}

13. 자연수 뒤집어 배열로 만들기

function solution(n) {
    return (''+n).split('').reverse().map(a => +a)
}

14. 자릿수 더하기

function solution(n) {
    return (''+n).split('').map(a => +a).reduce((a,b) => a+b)
}

15. 이상한 문자 만들기

function solution(s) {
    return s.split(' ')
        .map( str => str.split('')
             .map((word,i) => i % 2 ?
                  word.toLowerCase() :
                  word.toUpperCase()).join('')).join(' ');
}

16. 약수의 합

function solution(n) {
    return Array(n).fill(1).map((a, i) => a + i)
        .reduce((a, b) => a + (n % b === 0 ?  b : 0), 0)
}

17. 시저 암호

function solution(s, n) {
    function change(w) {
        const c = w.charCodeAt()
        if ( c >= 97 && c <= 122 ) {
            return c + n > 122 ?
                String.fromCharCode(c + n - 26) :
                String.fromCharCode(c + n)
        }
        if ( c >= 65 && c <= 90 ) {
            return c + n > 90 ?
                String.fromCharCode(c + n - 26) :
                String.fromCharCode(c + n)
        }
        return " ";
    }

    return s.split('').map(a => change(a)).join('')
}

18. 문자열을 정수로 바꾸기

function solution(s) {
    return +s
}

19. 수박수박수박수박수박수?

function solution(n) {
    return "수박".repeat(parseInt(n/2))+"수".repeat(n%2)
}

20. 소수 찾기

function solution(n) {
    const arr = Array(n+1).fill(true).fill(false, 0, 2);

    for ( let i = 2; i * i <= n; i++ ) {
        if ( arr[i] ) {
            for ( let j = i * i; j <= n; j += i ) { 
                arr[j] = false;
            }
        }
    }

    return arr.filter(e => e).length;
}

21. 서울에서 김서방 찾기

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

22. 문자열 다루기 기본

function solution(s) {
    return (s.length === 4 || s.length === 6) && 
        s.split('').every(a => !isNaN(a))
}

23. 문자열 내림차순으로 배치하기

function solution(s) {
    return s.split('')
        .map(a => a.charCodeAt()).sort((a,b) => b-a)
        .map(a => String.fromCharCode(a)).join('');
}

24. 문자열 내 p와 y의 개수

function solution(s){
    return !s.toUpperCase().split('').filter(a => a === 'P' || a === 'Y')
        .reduce((a, b) => a + (b === 'P' ? 1: -1), 0)
}

25. 문자열 내 마음대로 정렬하기

function solution(strings, n) {
    return strings
        .sort((a,b) => {
            let i = 0;
            while ( a[i] === b[i] ) i++; 
            return a[i].charCodeAt() - b[i].charCodeAt()
        })
        .sort((a,b) => a[n].charCodeAt() - b[n].charCodeAt());
}

26. 두 정수 사이의 합

function solution(a, b) {
    return ( a + b ) * ( Math.abs( b - a ) + 1 ) / 2;
}

27. 나누어 떨어지는 숫자 배열

function solution(arr, divisor) {
    const result = arr.filter(el => !(el%divisor)).sort((a,b) => a-b);
    return result.length ? result : [-1]
}

28. 같은 숫자는 싫어

function solution(arr) {
    return arr.filter((a,i) => a !== arr[i+1])
}

29. 가운데 글자 가져오기

function solution(s) {
    return s.length % 2 ? 
        s[parseInt(s.length/2)] :
        s.substr(s.length/2-1, 2);
}

30. 2016년

function solution(a, b) {
    return new Date( 2016, a-1,b ).toString().slice(0,3).toUpperCase();
}