1주차 문제풀이

주완·2023년 4월 2일
0

2023CodingTest

목록 보기
1/2
2023.03.31

1. 가운데 글자 가져오기

문제

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

🔎 기본제공
function solution(s) {
    var answer = '';
    return answer;
}

풀이

📃 제출코드

function solution(s) {
    let answer='';
    let len = Math.floor(s.length/2);
    if(s.length%2==0){
        answer = s[len-1]+s[len];
    } else {
        answer = s[len];
    }
    return answer;
}

📌 풀이설명

가운데 글자를 반환하기 위해서 가운데 index를 찾아서 Math.floor로 내림해주었다. 그리고 짝수인 경우와 홀수인 경우를 나누어 짝수인 경우에는 2글자를 반환하고 홀수인 경우에는 가운데 글자만 반환해주었다.

2023.04.01

2. 수박수박수박수박수박수?

문제

길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

🔎 기본제공
function solution(n) {
    var answer = '';
    return answer;
}

풀이

📃 제출코드

function solution(n) {
    let answer = '';
    for(let i=0; i<n; i++){
        if((i+1)%2==1) answer += '수';
        else answer += '박';
    }
    return answer;
}

📌 풀이설명

for문을 이용하여 n번째까지 반복해주며, 홀수 번째이면 수를 짝수 번째이면 박을 더하여 반환해주었다.

2023.04.02

3. 내적

문제

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.
이때, a와 b의 내적은 a[0]b[0] + a[1]b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

🔎 기본제공
function solution(a, b) {
    var answer = 1234567890;
    return answer;
}

풀이

📃 제출코드

function solution(a, b) {
    let answer = 0;
    for(let i in a){
        answer += a[i]*b[i];
    }
    return answer;
}

📌 풀이설명

for in을 활용하여서 key값에 접근할 수 있도록 하였다. key값에 순서대로 접근하여 a와 b 속성을 곱하고 더해주어 반환해주었다.

2023.04.03

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

문제

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

🔎 기본제공
function solution(n) {
    var answer = '';
    return answer;
}

풀이

📃 제출코드

function solution(s) {
    let answer = '';
    let str = s.split('').sort().reverse();
    for(let i in str){
        answer += str[i];
    }
    return answer;
}

📌 풀이설명

split으로 문자열을 배열로 나누어준 후 sort로 정렬해주었다. 그리고 reverse로 정렬된 배열을 반전시켜주고 for in을 통하여 순차적으로 문자열에 넣어 반환시켜주었다.

🔑 찾아보니 for in으로 하나씩 문자열에 더해 반환하는 것보다 join으로 문자열로 한 번에 바꾸어주는 방법이 더 효율적인 것 같다.

2023.04.04

5. 약수의 개수와 덧셈

문제

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

🔎 기본제공
function solution(left, right) {
    var answer = 0;
    return answer;
}

풀이

📃 제출코드

function solution(left, right) {
    let answer = 0;
    let cnt;
    for(let i=left; i<=right; i++){
        cnt = 1;
        for(let j = 1 ; j <= i/2 ; j++) if(i % j == 0) cnt++;
        if(cnt%2==0) answer+=i;
        else answer-=i;
    }
    return answer;
}

📌 풀이설명

left부터 right까지의 수들로 반복하고자 for문을 left부터 right까지 범위로 하였다. 약수는 본인을 제외하고 n/2보다 클 수 없어서 약수를 구할 때 전체 for문이 아닌 약수를 구하고자 하는 수/2까지만 돌려주었다. 이때, cnt는 약수의 개수인데 무조건 자기 자신은 포함되므로 1부터 시작해주었다.

🔑 다른 풀이를 찾아보니 제곱근의 정수이면 약수의 개수가 홀수임을 이용하여 풀 수 있다는 것을 알았다. for문으로 범위대로 반복하며 Math.sqrt()로 제곱근을 구해준다. 그 후 Number.isInteger로 그 값이 정수인지 확인하여 여부에 따라 더하거나 빼준다.

function solution(left, right) {
    var answer = 0;
    for (let i = left; i <= right; i++) {
        if (Number.isInteger(Math.sqrt(i))) {
            answer -= i;
        } else {
            answer += i;
        }
    }
    return answer;
}

2023.04.05

6. 문자열 다루기 기본

문제

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

🔎 기본제공
function solution(left, right) {
    var answer = 0;
    return answer;
}

풀이

📃 제출코드

function solution(s) {
    let cnt = 0;
    if(s.length!=4&&s.length!=6) return false;
    let arr = s.split('')
    for(const element of arr){
        if(0<=element&&element<=9) cnt++;
    }
    if(cnt==s.length) return true;
    else return false;
}

📌 풀이설명

먼저 문자열의 길이가 4혹은 6인지 판단하고자 length를 비교해주었다. 문자열 길이가 조건에 만족한다면 모두 숫자인지 알아보고자 split()로 문자열을 각각 문자로 나누고 for of로 반복하여 0에서 9 사이 숫자인지 비교하였다. 조건에 만족하는 문자의 개수가 문자열의 길이와 같다면 모두 숫자인 경우로 true를 아니라면 false를 반환하였다.

처음에는 문자열 내 모두 숫자일 경우에만 false를 반환하는 isNaN()을 사용하여 문제를 해결하려고 하였으나, 하나의 테스트 케이스에서 막혀 isNaN으로 해결하지 못하였다.

function solution(s) {
    if(s.length!=4&&s.length!=6) return false;
    if(!isNaN(s)) return true;
    else return false;
}

♦ 문제를 풀 때 삼항연산자를 이용하거나 함수를 이용해보는 것이 좋을 거 같다.

🔑 정규식을 활용하는 방법도 있었다. // 는 정규식이며 안에는 \d 숫자, ^ ~로 시작, {4} 길이 4, $ 숫자로 끝남, | 또는 을 의미한다. 즉, 숫자로 시작하고 길이가 4이며 숫자로 끝남 또는 숫자로 시작하고 길이가 6이며 숫자로 끝남을 이야기하는 것이다. 정규식에 대하여 test()로 조건에 만족하면 true를 아니면 false를 반환시키도록 한 것이다.

function solution(s) {  
  return /^\d{4}$|^\d{6}$/.test(s)
}

2023.04.06

7. 부족한 금액 계산하기

문제

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

🔎 기본제공
function solution(price, money, count) {
    var answer = -1;
    return answer;
}

풀이

📃 제출코드

function solution(price, money, count) {
    let sum = 0;
    for(let i=1; i<=count; i++) sum += price*i;
    if(money<sum) return sum-money;
    return 0;
}

📌 풀이설명

놀이기구를 n번째 이용하기 때문에 1부터 count까지 for문으로 반복해주며, 값을 더해주었다. 그리고 가지고 있는 돈과 합계를 비교하여 지출해야하는 합계가 크다면 부족한 값을 반환하였다.

♦ 문제를 풀 때 삼항연산자를 이용하거나 함수를 이용해보는 것이 좋을 거 같다.

🔑 다른 풀이를 찾아보니 가우식 공식을 사용하여 (처음 숫자 + 마지막 숫자) (마지막 숫자 - 처음 숫자) 1/2를 통해 1부터 count까지의 합을 구한 후 가격을 곱해주면 총 합계가 나온다. 그 후 가지고 있는 돈을 빼주었을 때 조건을 비교하여 값을 반환한다.

function solution(price, money, count) {
    const tmp = price * count * (count + 1) / 2 - money;
    return tmp > 0 ? tmp : 0;
}

2023.04.07

8. 행렬의 덧셈

문제

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

🔎 기본제공
function solution(arr1, arr2) {
    var answer = [[]];
    return answer;
}

풀이

📃 제출코드

function solution(arr1, arr2) {
    let answer = [];
    for(let i in arr1){
        let arr = [];
        for(let j in arr1[i]){
            arr.push(arr1[i][j]+arr2[i][j]);
        }
        answer.push(arr)
    }
    return answer;
}

📌 풀이설명

먼저 for in으로 arr1의 길이까지 반복해주고 반환할 배열 안에 들어갈 배열을 만들어주었다. 그 배열에 for in으로 arr1[i]의 길이까지 반복하여 같은 행렬끼리 덧셈을 구하고 push하여 넣어준다. 그리고 그 배열을 다시 반환할 배열에 넣어주었다.

🔑 다른 풀이를 찾아보니 map을 중첩하여 풀었는데, 아직은 이해하기 어려웠다. 첫 배열에 map을 이용해 i 인덱스를 만들고 또 그 내부 배열에 map을 걸어 j 인덱스를 만든다. 그리고 B배열의 i,j 요소를 더해 반환한다. 빈배열을 할당하지 않아도 두 배열을 다뤄서인지 구성된다는 점이 신기했다.

function sumMatrix(A,B){
    return A.map((arr1, idx1) => arr1.map((val, idx2) => val+B[idx1][idx2]));
}

2023.04.08

9. 직사각형 별찍기

문제

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.

🔎 기본제공
process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
    console.log(a);
    console.log(b);
});

풀이

📃 제출코드

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
    for(let i=0; i<b; i++){
        let str = "";
        for(let j=0; j<a; j++){
            str += '*';
        }
        console.log(str);
    }
});

📌 풀이설명

for문을 통해서 a까지 반복하여 빈 문자열에 '*'을 추가해준다. 그리고 a까지 돌린 후 문자열을 찍어준다. b까지 반복하는 for문 안에 넣어 직사각형으로 나올 수 있도록 한다.

🔑 다른 풀이를 찾아보니 repeat 메서드를 통해 '*'을 a 횟수만큼 반복하여 붙인 새로운 문자열을 만들어준다. 그리고 만들어준 문자열을 b까지 반복하는 for문으로 출력한다.

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

});
profile
배움을 기록하자

0개의 댓글