TIL 10일차 - Javascript 코딩 테스트 풀이 답안 정리(1)

박찬웅·2023년 2월 15일
0

항해99

목록 보기
15/105

23년 2월 15일

  • 모든 문제의 출처는 프로그래머 스쿨에서 가져왔으며, 아래 적은 코드들의 답은 되도록 스스로 풀려고 생각했으나, 모르는 것들은 팀원들과 같이 풀거나, 기술매니저님한테 도움을 받았습니다.

1. 직사각형 별찍기

직사각형 별찍기 문제 푸는 곳
해답 및 설명

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 star = ""
        // 별 몇개를 찍을 개수를 정하는 가로 줄
        for (let j = 0; j < a; j++) {
            star = star + "*"
        }
        console.log(star)
    }
});

처음부터 문제가 굉장히 막막하였다. 근데 핵심은 for문을 두번 쓰는 이중 for문이 핵심이였다. a는 가로줄, b는 세로줄로 보면 편하였고, 결론적으로 첫번째 for문을 통해서 몇 줄을 적을 것인지를 정하고, 두번째 for문을 통해서 * 표시를 하는 것으로 풀면 되었다.

2. 짝수와 홀수

짝수와 홀수 문제 푸는 곳
해답 및 설명

function solution(num) {
    var answer = '';
    if ( num % 2 === 0 ) {
        answer = "Even" // 짝수
    } else {
        answer = "Odd" // 홀수
    }
    return answer;
}

이 문제는 매우 간단했다. 그냥 if문 써서 나머지값이 0이면 짝수, 아니면 else문을 통해 홀수를 출력하면 끝이였다.

3. 가운데 글자 가져오기

가운데 글자 가져오기 문제 푸는 곳
해답 및 설명

function solution(s) {
    var answer = '';
        if (s.length % 2 === 1) {
            answer = s[(s.length - 1) / 2]; // 홀수 일때 
        } else {
            answer = s[s.length / 2 - 1] + s[s.length / 2]; // 짝수 일때
        }
        
    return answer;
}

앞선 홀수와 짝수 문제랑 비슷하였다. 역시 if문을 사용하면 되었지만, 차이점은 문자를 출력하는 것이였기 때문에 우선 길이가 홀수 일때랑 아닐때로 if문을 선언 하였고, s의 몇번째 철자를 출력 하는 수학적인 사고력이 필요했던 문제였다.

4. 두 정수 사이의 합

두 정수 사이의 합 문제 푸는 곳
해답 및 설명

function solution(a, b) {
    var answer = 0;
    if (a < b) {
        for (let i = a; i <= b; i++) {
            answer += i;
        }
    } else if (a > b) {
        for (let i = b; i <= a; i++) {
            answer += i;
        }
    } else {
        answer = a;
    }
    return answer;
}

이 문제 같은 경우에는 if문과 for문을 적절하게 잘 사용해야 풀 수 있었던 문제였다. 역시 a와 b를 숫자를 비교를 하는 기준이 필요했고, 그 기준을 토대로 i를 a부터 b까지 1씩 늘리면서 모두 더하는 값을 구하면 되었다. 그리고 만약 두 a, b가 같을때는 그대로 a를 출력하면 끝났다.

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

문자열을 정수로 바꾸기 문제 푸는 곳
해답 및 설명

function solution(s) {
    var answer = 0;
    answer = Number(s);
    return answer;
}
// 다만 아래의 방법으로도 가능하다. 문자열 안에 있는 정수랑 연산하면 정수로 나타낸다.
function solution(s) {
    return s/1;
}

문자열을 정수로 바꾸는 방법은 구글링을 통해서 찾아 봤는데 Number()를 이용하면 간단했다. Number() 함수 자체가 문자열로 된 숫자를 그냥 단순하게 정수로 바꾸는 함수라고 보면 된다고 보면 된다.
그런데 팀원 중 한 분이 단 1줄로만 구현한 독특한 방법이 있었는데 (+)연산을 제외한 다른 연산자로 계산을 하게 된다면 문자열된 숫자를 그냥 일반 정수로 취급해서 계산하게 된다. 그래서 나누기 1을 하면 그대로 정수가 출력될 수 있었다.

6. 없는 숫자 더하기

없는 숫자 더하기 문제 푸는 곳
해답 및 설명

function solution(numbers) {
    var answer = 0;
    for (let i = 0; i <= 9; i++) {
        if (!(numbers.includes(i))) // numbers 함수를 활용, !를 사용해서 없는 숫자만 입력
        answer += i;
    }
    return answer;    
}

우선 i가 일의 자리였기 때문에 for문으로 간단하게 정리 하였다. 배열 안에 있는 모든 숫자를 탐색 하는 방법은 역시 구글링을 통해서 includes()를 이용하면 되었다. 이러면 배열에 있는 모든 숫자가 탐색이 가능해 출력 할 수 있다. 다만 여기서 찾아야 할 것은 배열에 없는 숫자를 찾아야 했기 때문에 !를 사용하면 반대의 결과가 나오기 때문에 없는 숫자만 출력 하게 된다. 그리고 나서 없는 숫자들만 모두 더하는 식을 내면 되었다.

7. 음양 더하기

음양 더하기 문제 푸는 곳
해답 및 설명

function solution(absolutes, signs) {
    let answer = 0;
    for (let i = 0; i < absolutes.length; i++) {
        if (signs[i] === true) {
            answer += absolutes[i];
        } else {
            answer -= absolutes[i];
        }
    }
    
    return answer;
}

이 문제는 혼자서는 못 풀어서 팀원 한 분이랑 같이 공유하면서 풀었다. 근데 딱 보니까 이 문제도 if문의 조건을 잘 지정하면 어려웠던 문제는 아니였다. 먼저 for문으로 absolutes의 길이까지 실행하게 정의하고 if문으로 signs의 i번째를 기준으로 true면 더하고 false면 빼면 되었다.

8. 평균 구하기

평균 구하기 문제 푸는 곳
해답 및 설명

function solution(arr) {
    var answer = 0;
    for (let i = 0; i < arr.length; i++ ) { // arr 안에 있는 배열 총 개수 정의
        answer += arr[i] / arr.length; // 평균 = arr 안에 배열의 있는 합계 / 배열 개수
    }
    return answer
}

평균문제는 이전에 수학 공식을 생각하면 바로 풀 수 있었다. 배열 숫자의 합을 모두 더 하고, 배열의 개수로 나누면 끝이다.

9. 핸드폰 번호 가리기

핸드폰 번호 가리기 문제 푸는 곳
해답 및 설명

function solution(phone_number) {
    var answer = '';
    for (let i = 0; i < phone_number.length - 4; i++) {
        answer += '*';    
    }
    answer += phone_number.slice(-4)
    return answer;
}

폰 넘버 문제는 조금 생소하였다. 요 문제는 팀원들이랑 같이 풀었던 문제였는데, 일부분만 출력 하는 slice 메소드를 이용하면 되었다. 먼저 별을 출력 하기 위해서 마지막 4번째는 제외하고 출력을 해야 하므로 길이에서 4를 뺀 값까지만 출력을 한다. 그런 다음에 구글링을 통해서 slice 메소드를 사용해서 -4만 적으면 -4번째 부터 오른쪽 끝까지 출력하면 되었다.

10. 행렬의 덧셈

행렬의 덧셈 문제 푸는 곳
해답 및 설명

function solution(arr1, arr2) {
    var answer = [];
    for (let i = 0; i < arr1.length; i++) {
            answer[i] = [];
        for (let j = 0; j < arr2[i].length; j++){
            answer[i][j] = arr1[i][j] + arr2[i][j]
        }
    }
    return answer;
}

금일 문제 풀었던 문제에서 가장 어려웠다. 이 문제는 스스로 풀어도 해결 기미가 안보였고, 팀원들이랑 같이 공유해도 못풀어서 결국에는 다른 사람이 적은 답안을 보고 이해 하였다. 배열을 통해서 각 배열끼리 합산하는 것은 쉬웠는데, 제일 중요한 것은 배열 크기의 정의를 나타내지 못한것이 문제였다.
풀이를 하자면 다음과 같다. 먼저 arr1의 길이까지 돌려서 for문을 정의 한 후 i번째 까지 표현 해서 행렬의 크기를 정의를 하였다. 그런 다음에 j로 arr2의 i번째 배열의 길이만큼 for문을 정의를 해야 비로소 두 행렬의 행과 열끼리 일치 한 숫자랑 더할 수 있었다.
설명으로 보면 여전히 이해는 안됬지만 매니저님 설명으로 대략적으로 이해는 되었다.

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

x만큼 간격이 있는 n개의 숫자 문제 푸는 곳
해답 및 설명

function solution(x, n) {
    var answer = [];
    for (let i = 1; i <= n; i++) {
        answer.push(i*x)
    }
    return answer;
}

이전 10번 문제가 많이 어려워서 그런지 11번은 그나마 할만 했다. 구글링을 통해서 배열을 추가하는 push 메소드를 사용하면 되었다. 대신 차이점이라면 x와 n을 곱하는 것이였기 때문에 i를 1부터 n까지 for문을 돌려야 제대로 나왔다. 그리고 나서 push 메소드를 써서 i와 x를 곱하면 되었다.

알게 된 점

오늘부터 본격적을 코딩테스트 문제를 풀기 시작했다. 4일 동안 총 28문제를 풀면 되는데, 이러면 매일 7문제만 풀면 되는거 아니냐고 물을 수 있지만, 뒤로 갈수록 난이도가 올라가기 때문에 오늘은 최대한 집중해서 11문제를 푸는 것으로 마무리 되었다. 아직 메소드 사용하는 방법이 많이 익숙하지 않아서 모르는 것들은 구글링 해서 찾아봐서 푸는게 대부분 이였는데, 특히 ES6 메소드는 많이 이해 할 필요가 있었다. 그래도 10문제 이상 풀어서 좋은 출발을 하게 된 것 같다. 그리고 28문제를 다 풀면 거기서 끝나는 것이 아니라 추가 문제도 있기 때문에 많이 푸는 것은 좋다는 것을 알게 되었고, 막히는 문제가 있으면 한번 직접 console.log()를 사용하면서 제대로 출력 되고 있는지 한번 확인하면 파악하는데 도움이 된다고 기술매니저님한테 조언을 받았다. 그리고 내가 적은 답안은 꼭 모범답안은 아니고, 다른사람이 풀이 한 것 보면 내가 상상하지도 못했던 기상천외 한 답안도 많았었다. 시간 되면 다른사람 풀이랑 비교하고 분석하는 것도 좋다고 말씀하셨다.

앞으로 할 일

목표치인 28문제 중에서 11문제를 풀었다. 이러면 내일부터는 조금 부담이 줄어들겠지만 그만큼 어려워지기 때문에 메소드 부분은 더 공부를 할 예정이고, 내일도 더 많은 문제를 풀어 볼 예정이다.

profile
향해 13기 node.js 백앤드

0개의 댓글