Javascript로 코테를 준비하는 사람들을 위한 코딩 기초 트레이닝 코스 (2) 30문제

osohyun0224·2023년 7월 10일
1
post-thumbnail

안녕하세요, Js로 코테를 공부하는 주인장입니다.

우선 이 시리즈에 대한 설명은 이 시리즈 첫 번째 글을 참고해주세요!

비기너 코스 (1) 벨로그:)

저의 방학 코테 공부 프로젝트 시리즈 2번째 글을 시작합니다! 계속해서 벨로그 내용을 채워갈 예정이고, 이번 포스팅에서는 프로그래머스의 코딩 기초 트레이닝 124문제를 풀면서 함수를 정리해갈 예정입니다!

1. 문자열의 앞의 n글자

  • 문제: 문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string의 앞의 n글자로 이루어진 문자열을 return 하는 solution 함수를 작성해 주세요.
  • 코드 : slice()함수!! 어떤 배열의 begin 부터 end 까지(end 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환
function solution(my_string, n) {
    var answer = '';
    answer=my_string.slice(0,n);
    return answer;
}

2. 문자열 곱하기, 문자열 반복해서 출력하기

  • 문제: 문자열 my_string과 정수 k가 주어질 때, my_string을 k번 반복한 문자열을 return 하는 solution 함수를 작성해 주세요.
  • 코드: repeat()함수!! 주어진 문자열을 옵션의 카운트(k)만큼 반복하여 붙인 다음에 새로운 문자열로 반환하는 함수이다.
function solution(my_string, k) {
    var answer = '';
    answer=my_string.repeat(k);
    return answer;
}

3. 접두사인지 확인하기

  • 문제: 어떤 문자열에 대해서 접두사는 특정 인덱스까지의 문자열을 의미합니다. 예를 들어, "banana"의 모든 접두사는 "b", "ba", "ban", "bana", "banan", "banana"입니다.
    문자열 my_string과 is_prefix가 주어질 때, is_prefix가 my_string의 접두사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.
  • 코드: startsWith()함수 어떤 문자열이 특정 문자로 시작하는지 확인하여 결과를 true 혹은 false로 반환한다.
function solution(my_string, is_prefix) {
  if (my_string.startsWith(is_prefix)) {
    return 1;
  } else {
    return 0;
  }
}

4. 소문자로 바꾸기

  • 문제: 알파벳으로 이루어진 문자열 myString이 주어집니다. 모든 알파벳을 소문자로 변환하여 return 하는 solution 함수를 완성해 주세요.
  • 코드: String.toLowerCase() 함수 / 대문자로 변환하는 함수는 str.toUpperCase()
class Solution {
    public String solution(String myString) {
        String answer = "";
        answer=myString.toLowerCase();
        return answer;
    }
}

5. n보다 커질 때까지 더하기

  • 문제: 정수 배열 numbers와 정수 n이 매개변수로 주어집니다. numbers의 원소를 앞에서부터 하나씩 더하다가 그 합이 n보다 커지는 순간 이때까지 더했던 원소들의 합을 return 하는 solution 함수를 작성해 주세요.
  • 코드 1: 그냥 노가다 무지성 코드!
function solution(numbers, n) {
    var answer = 0;
    var sum =0;
    for(let i =0; i < numbers.length ; i++){
        sum+=numbers[i];
        if(sum>n){
            return sum;
        }
    }
    answer=sum;
    return answer;
}
  • 다른 사람들 풀이로 얻은 방법 !
    다른 사람들 풀이를 보니까 reduce() 함수를 쓰더라고요...?
function solution(numbers, n) {
  return numbers.reduce((acc, cur) => {
    if (acc > n) return acc;
    return acc + cur;
  });
}

reduce함수와 싸우기- teo_ryu님 벨로그
위의 벨로그 작성 글이 reduce함수를 이해하는데 많은 도움이 되었다.. 다들 위의 벨로그로 reduce 함수를 이해하길!

암튼, 위의 풀이를 위의 벨로그를 통해 고찰해보자.
아래는 reduce()함수의 기본 공식이다.

const numbers = [4, 3, 2, 1];
let sum = numbers.reduce((acc, cur) => {
	return acc + cur;
});

acc 에는 numbers의 가장 첫 번째 원소인 4가 할당 되고,
cur 에는 numbers의 나머지 원소인 3,2,1이 순차적으로 들어간다고 한다.

function solution(numbers, n) {
  return numbers.reduce((acc, cur) => {
    if (acc > n) return acc;
    return acc + cur;
  });
}

6. a와 b 출력하기

  • 문제: 정수 a와 b가 주어집니다. 각 수를 입력받아 입출력 예와 같은 형식으로 출력하는 코드를 작성해 보세요.
  • 코드:
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
    console.log(`a = ${Number(input[0])}\nb = ${Number(input[1])}`);
});

7. 대소문자 바꿔서 출력하기

  • 문제: 영어 알파벳으로 이루어진 문자열 str이 주어집니다. 각 알파벳을 대문자는 소문자로 소문자는 대문자로 변환해서 출력하는 코드를 작성해 보세요.
  • 코드 : readline코드라서 쫄필요가 없다!!
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = [line];
}).on('close',function(){
    str = input[0];
    let arr= [];
    for(let i =0; i<str.length;i++){
        if(str[i] === str[i].toUpperCase()){
            arr.push(str[i].toLowerCase());
        }else{
            arr.push(str[i].toUpperCase());
        }
    }
    console.log(arr.join(""));
});

8. 특수문자 출력하기

  • 문제: 다음과 같이 출력하도록 코드를 작성해 주세요.
  • 출력예시: !@#$%^&*(\'"<>?:;
  • 코드:
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on('close', function () {
    console.log('!@#$%^&*(\\\'"<>?:;');
});

9. 덧셈식 출력하기

  • 문제: 두 정수 a, b가 주어질 때 다음과 같은 형태의 계산식을 출력하는 코드를 작성해 보세요. a + b = c
  • 코드 : 노가다 무지성 코드
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
    let sum = Number(input[0])+Number(input[1]);
    console.log(String(Number(input[0])+ " + " + Number(input[1]) + " = " + sum));
});

10. 문자열 돌리기

  • 문제: 문자열 str이 주어집니다. 문자열을 시계방향으로 90도 돌려서 아래 입출력 예와 같이 출력하는 코드를 작성해 보세요.
  • 코드 : 문자열을 한 글자씩 자르는 함수 split()
    이 함수 괄호 안에 공백문자를 파라미터로 지정해야 함 따라서 split("")
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = [line];
}).on('close',function(){
    str = String(input[0]);
    let answer = str.split("");
    for(let i =0; i < answer.length; i++){
        console.log(answer[i] );
    }
});

11. 홀짝 구분하기

  • 문제:자연수 n이 입력으로 주어졌을 때 만약 n이 짝수이면 "n is even"을, 홀수이면 "n is odd"를 출력하는 코드를 작성해 보세요.
  • 코드:
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
    n = Number(input[0]);
    if(n%2==0){
        console.log(n + " is even");
    }
    else {
        console.log(n + " is odd");
    }
});

12. 문자열 겹쳐쓰기

  • 문제: 문자열 my_string, overwrite_string과 정수 s가 주어집니다. 문자열 my_string의 인덱스 s부터 overwrite_string의 길이만큼을 문자열 overwrite_string으로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.
  • 코드: splice()함수는 배열 객체에 사용할 수 있는 내장 메서드입니다. 이는 기존 요소를 삭제하거나 교체하여 배열의 내용을 변경하며, 제거된 요소가 담긴 별도의 배열을 새로 반환합니다.
  • splice()함수의 자세히 정리된 블로그
  • 스프레드 연산자 (...) 사용학기
    아래의 코드에서 var answer = [...my_string]; 는 JavaScript의 스프레드 연산자(...)를 사용하여 문자열 my_string의 모든 문자를 개별적인 요소로 가지는 배열을 생성합니다. 스프레드 연산자를 사용하면 기존의 배열이나 문자열 등의 모든 요소를 새로운 배열에 복사할 수 있습니다. 이것은 원본 문자열을 변경하지 않고 새 배열에서 문자열에 대한 작업을 수행할 수 있도록 해줍니다.
function solution(my_string, overwrite_string, s) {
    var answer = [...my_string];
    answer.splice(s, overwrite_string.length, overwrite_string);
    return answer.join('');
}

13. 문자열 섞기

  • 문제: 길이가 같은 두 문자열 str1과 str2가 주어집니다. 두 문자열의 각 문자가 앞에서부터 서로 번갈아가면서 한 번씩 등장하는 문자열을 만들어 return 하는 solution 함수를 완성해 주세요.
  • 코드1: 무지성 코드
function solution(str1, str2) {
    var answer = '';
    for( let i =0 ; i<str1.length;i++){
        answer+= str1[i]+str2[i];
    }
    return answer;
}
function solution(str1, str2) {
    return [...str1].map((x, idx)=> x+str2[idx]).join("");
}

14. 문자 리스트를 문자열로 변환하기

  • 문제:문자들이 담겨있는 배열 arr가 주어집니다. arr의 원소들을 순서대로 이어 붙인 문자열을 return 하는 solution함수를 작성해 주세요.
  • 코드: join()함수 이용 -> 배열의 모든 값들을 연결한 문자열을 리턴합니다.
function solution(arr) {
    var answer = '';
    answer=arr.join('');
    return answer;
}

15. 더 크게 합치기

  • 문제: 연산 ⊕는 두 정수에 대한 연산으로 두 정수를 붙여서 쓴 값을 반환합니다. 예를 들면 다음과 같습니다.
    12 ⊕ 3 = 123
    3 ⊕ 12 = 312
    양의 정수 a와 b가 주어졌을 때, a ⊕ b와 b ⊕ a 중 더 큰 값을 return 하는 solution 함수를 완성해 주세요. 단, a ⊕ b와 b ⊕ a가 같다면 a ⊕ b를 return 합니다.

  • 풀이 1 : 그냥 a,b를 String으로 변환하고 나서 더하고, 이걸 다시 Number로 형변환 했는데 47% 만 맞음 ^^.... 틀린 이유는 테케만 보고 아 걍 더하면 되네 이 생각해가지고 조건을 생각안해줌 진짜 바보니ㅜ 왜 틀렸지? 이러고 있었네

function solution(a, b) {
    var answer = 0;
    answer= Number(String(a)+String(b));
    return answer;
}
  • 풀이 2: 조건도 잘 확인하고 넣어주었습니다.
function solution(a, b) {
    var answer = 0;
    let answer1= Number(String(a)+String(b));
    let answer2= Number(String(b)+String(a));
    if(answer1>=answer2){
        answer=answer1;
    }
    else{
        answer=answer2;
    }
    return answer;
}

16. 두 수의 연산값 비교하기

  • 문제: 연산 ⊕는 두 정수에 대한 연산으로 두 정수를 붙여서 쓴 값을 반환합니다. 예를 들면 다음과 같습니다.
    12 ⊕ 3 = 123
    3 ⊕ 12 = 312
    양의 정수 a와 b가 주어졌을 때, a ⊕ b와 2 a b 중 더 큰 값을 return하는 solution 함수를 완성해 주세요. 단, a ⊕ b와 2 a b가 같으면 a ⊕ b를 return 합니다.

  • 코드:위의 문제랑 비슷한 방식으로 풀었음 무난~

function solution(a, b) {
    var answer = 0;
    let answer1=Number(String(a)+String(b));
    let answer2=2*a*b;
    if( answer1 >= answer2){
        answer=answer1;
    }
    else{
        answer=answer2;
    }
    return answer; 
}

17. 조건 문자열

  • 문제: 두 문자열 ineq와 eq가 주어집니다. ineq는 "<"와 ">"중 하나고, eq는 "="와 "!"중 하나입니다. 그리고 두 정수 n과 m이 주어질 때, n과 m이 ineq와 eq의 조건에 맞으면 1을 아니면 0을 return하도록 solution 함수를 완성해주세요.
  • 코드1: 무지성 직역 코드
function solution(ineq, eq, n, m) {
    var answer = 0;
    if(ineq==">"&& eq=="="){
        if(n>=m){answer=1;}
        else{answer=0;}
    }
    else if(ineq==">"&& eq=="!"){
        if(n>m){answer=1;}
        else{answer=0;}
    }
    else if(ineq=="<" && eq=="="){
        if(n<=m){answer=1;}
        else{answer=0;}
    }
    else {
        if(n<m){answer=1;}
        else{answer=0;}
    }
    return answer;
}
  • 코드2: 다른 사람들의 효율적인 풀이 고찰 (1)
    아니 .... 소현아 머리를 쓰자.....
function solution(ineq, eq, n, m) {
    if (eq === '=' && n === m) return 1
    if (ineq === '<' && n < m) return 1
    if (ineq === '>' && n > m) return 1
    return 0
}
  • 코드 3: 다른 사람들의 효율적인 풀이 고찰 (2)
    조건문 이렇게도 줄일 수 있다!
function solution(ineq, eq, n, m) {
    if (ineq === "<") {
        return eq === "=" ? (n <= m ? 1 : 0) : (n < m ? 1 : 0);
    }

    if (ineq === ">") {
        return eq === "=" ? (n >= m ? 1 : 0) : (n > m ? 1 : 0);
    }
}

18. 이어 붙인 수

  • 문제:정수가 담긴 리스트 num_list가 주어집니다. num_list의 홀수만 순서대로 이어 붙인 수와 짝수만 순서대로 이어 붙인 수의 합을 return하도록 solution 함수를 완성해주세요.

  • 코드 1: filter로 걍 이어붙인 내 코드

function solution(num_list) {
    let sol = num_list.filter(el=>(el%2===1));
    let sol2 = num_list.filter(el=>(el%2===0));
    return Number(sol.join(''))+Number(sol2.join(''));

}
  • 코드 2: 다른 사람의 풀이
function solution(num_list) {
    var even = num_list.filter(n => n % 2 === 0).reduce((acc, cur) => acc+cur, '');
    var odd = num_list.filter(n => n % 2 === 1).reduce((acc, cur) => acc+cur, '');
    return Number(even) + Number(odd);
}

내 블로그 포스팅으로 정리해둔 filter함수

19. 문자열의 뒤의 n글자

  • 문제: 문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string의 뒤의 n글자로 이루어진 문자열을 return 하는 solution 함수를 작성해 주세요.
  • 코드: slice()함수를 사용해 문자열을 자른다!!!
function solution(my_string, n) {
    var answer = '';
    answer=my_string.slice(my_string.length-n,my_string.length);
    return answer;
}

20. 카운트 업

  • 문제:정수 start와 end가 주어질 때, start부터 end까지의 숫자를 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

  • 코드: 배열에 하나씩 넣을 때 push()함수 사용하기

function solution(start, end) {
    var answer = [];
    for(let i=start;i<=end;i++){
        answer.push(i);
    }
    return answer;
}

21. 조건에 맞게 수열 변환하기 3

  • 문제:정수 배열 arr와 자연수 k가 주어집니다.
    만약 k가 홀수라면 arr의 모든 원소에 k를 곱하고, k가 짝수라면 arr의 모든 원소에 k를 더합니다.
    이러한 변환을 마친 후의 arr를 return 하는 solution 함수를 완성해 주세요.
    - 코드: push()함수
function solution(arr, k) {
    var answer = [];
    if(k%2!=0){
        for(let i=0;i<arr.length;i++){
            answer.push(arr[i]*k);
        }
    }
    else if(k%2==0){
        for(let j=0;j<arr.length;j++){
            answer.push(arr[j]+k);
        }
    }
    return answer;
}

22. 문자열 정수의 합

  • 문제: 한 자리 정수로 이루어진 문자열 num_str이 주어질 때, 각 자리수의 합을 return하도록 solution 함수를 완성해주세요.

- 코드: 이 문제의 핵심은 map()함수!

function solution(num_str) {
    var answer = [];
    answer=num_str.split("").map(Number);
    let sum=answer.reduce((a,b)=>(a+b));
    return sum;
}

23. 배열의 길이에 따라 다른 연산하기

  • 문제:정수 배열 arr과 정수 n이 매개변수로 주어집니다. arr의 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을, arr의 길이가 짝수라면 arr의 모든 홀수 인덱스 위치에 n을 더한 배열을 return 하는 solution 함수를 작성해 주세요.
  • 코드: 해당 하는 인덱스만 바꿔주고 해당하지 않는 인덱스 번호까지 반환해야한다.
function solution(arr, n) {
    var answer = [];
    if(arr.length%2!=0){
        for(let i=0;i<arr.length;i++){
            if(i%2==0){
                answer.push(arr[i]+n);
            }else{
                answer.push(arr[i]);
            }
        }
    }
    else{
        for(let i=0;i<arr.length;i++){
            if(i%2!=0){
                answer.push(arr[i]+n);
            }else{
                answer.push(arr[i]);
            }
        }
    }    return answer;
}
  • 해당하는 인덱스만 리턴하는 코드
function solution(arr, n) {
    var answer = [];
    if(arr.length%2!=0){
        for(let i=0;i<arr.length;i+=2){
            answer.push(arr[i]+n);
        }
    }
    else{
        for(let i=1;i<arr.length;i+=2){
            answer.push(arr[i]+n);
        }
    }    return answer;
}

24. 마지막 두 원소

  • 문제: 정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.
  • 코드: 배열의 마지막 인덱스 번호로 삽입해주는 pop()함수
function solution(num_list) {
    var answer = [];
    if(num_list[num_list.length-1]>num_list[num_list.length-2]){
        let a = num_list[num_list.length-1] - num_list[num_list.length-2];
        num_list.push(a);
    }
    else{
        let a = num_list[num_list.length-1]*2;
        num_list.push(a);
    }
    return num_list;
}

25. n개 간격의 원소들

  • 문제: 정수 리스트 num_list와 정수 n이 주어질 때, num_list의 첫 번째 원소부터 마지막 원소까지 n개 간격으로 저장되어있는 원소들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
  • 코드:
function solution(num_list, n) {
    var answer = [];
    for(let i=0;i<num_list.length;i+=n){
        answer.push(num_list[i]);
    }
    return answer;
}

26. 원소들의 곱과 합

  • 문제: 정수가 담긴 리스트 num_list가 주어질 때, 모든 원소들의 곱이 모든 원소들의 합의 제곱보다 작으면 1을 크면 0을 return하도록 solution 함수를 완성해주세요.
  • 코드 : 배열안의 모든 원소를 가지고 뭘하는건 reduce함수를 쓰기
function solution(num_list) {
    var answer = 0;
    for(let i=0;i<num_list.length;i++){
        let mul= num_list.reduce((a,b)=>(a*b));
        let sum =num_list.reduce((a,b)=>(a+b));
        if(mul<sum*sum){
            answer=1;
        }
        else{
            answer=0;
        }
    }
    return answer;
}

27. 정수 찾기

  • 문제:정수 리스트 num_list와 찾으려는 정수 n이 주어질 때, num_list안에 n이 있으면 1을 없으면 0을 return하도록 solution 함수를 완성해주세요.
  • 코드:
    첫 번째 if문에서 해당이 되고, 그 안에 break로 끊어주지 않으면 else문까지 다른 원소들이 해당 되므로 0으로 리턴될 수 있다. 따라서 무조건 if문에서 끊어줘야한다고 생각했다! 성공함 ~
function solution(num_list, n) {
    var answer = 0;
    for(let i=0;i<num_list.length;i++){
        if(num_list[i] == n){
            answer=1;
            break;
        }
        else {
            answer=0;
        }
    }
    return answer;
}

28. 첫 번째로 나오는 음수

  • 문제: 정수 리스트 num_list가 주어질 때, 첫 번째로 나오는 음수의 인덱스를 return하도록 solution 함수를 완성해주세요. 음수가 없다면 -1을 return합니다.
  • 코드: 위의 27번과 유형이 비슷하다!! 조건에 따라 아래의 조건으로 넘어가지 않도록 break문으로 제한을 걸어둔다.
function solution(num_list) {
    var answer = 0;
    for(let i=0; i<num_list.length;i++){
        if(num_list[i]<0) {
            answer=i; 
            break;
    }
        else{
            answer=-1;
        }
    }
    return answer;
}

29. 조건에 맞게 수열 변환하기 1

  • 문제: 정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱합니다. 그 결과인 정수 배열을 return 하는 solution 함수를 완성해 주세요.
  • 코드: 문제에서 주어진 조건에 해당하지 않는 원소들도 고려해야된다! 이 부분은 else문을 추가해서 answer 배열에 원소를 추가해주었다.
function solution(arr) {
    var answer = [];
    for(let i=0; i<arr.length;i++){
    if(arr[i]>=50 && arr[i]%2==0){
        answer.push(arr[i]/2);
    }
    else if(arr[i]<50 && arr[i]%2!=0){
        answer.push(arr[i]*2);
    }
    else{
        answer.push(arr[i]);
    }
    }
    
    return answer;
}

30. 수 조작하기 1

  • 문제:정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.
    "w" : n이 1 커집니다.
    "s" : n이 1 작아집니다.
    "d" : n이 10 커집니다.
    "a" : n이 10 작아집니다.
    위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.

  • 코드 : 문자열을 배열로 변환, 배열의 처음 부터 끝까지 쭉 반복하며 n의 수를 카운트

function solution(n, control) {
    let ans=control.split("");
    for(let i=0;i<ans.length;i++){
        if(ans[i]=="w"){
            n+=1;
        }
        else if(ans[i]=="s"){
            n-=1;
        }
        else if(ans[i]=="d"){
            n+=10;
        }
        else if(ans[i]=="a"){
            n-=10;
        }
    }
    return n;
}

31. 특정한 문자를 대문자로 바꾸기

  • 문제: 영소문자로 이루어진 문자열 my_string과 영소문자 1글자로 이루어진 문자열 alp가 매개변수로 주어질 때, my_string에서 alp에 해당하는 모든 글자를 대문자로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.

  • 코드: 문자열 -> 배열 -> 해당하는애 바꾸기 -> 문자열

function solution(my_string, alp) {
    var answer = '';
    let ans = my_string.split("");
    for(let i=0;i<ans.length;i++){
        if(ans[i]==alp){
            ans[i]=ans[i].toUpperCase();
        }
    }
    answer=ans.join('');
    return answer;
}
profile
학부생 Frontend Developer

0개의 댓글