TIL 15일차 - Javascript 코딩 테스트 시험

박찬웅·2023년 2월 20일
0

항해99

목록 보기
20/105

23년 2월 20일

배운 것

금일은 코딩테스트 시험이 있어서 시험을 치르고, 그리고 팀원들이랑 푼 답을 공유하는 시간을 가졌다. 총 문제는 3문제였으며, 이중 2문제를 골라서 풀면 되었다. 과거 선배 기수들이 본인이 푼 것들을 설명하고 영상 촬영을 하는 것도 있었는데, 우리 기수에서는 그 과정이 생략이 되었다.

1. 물건을 구매해볼까?(하)

문제 설명, 답안 및 풀이

// ## 하. 물건을 구매해볼까?

// 르탄이가 1000원을 가지고 편의점에서 물건을 사려고 한다. 
// 편의점에는 500원, 100원, 50원, 10원이 충분히 있고, 편의점 직원은 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 
// 르탄이가 편의점에서 물건을 사고 1000원 지폐 한 장을 냈을 때, 받을 잔돈의 개수를 구하는 프로그램을 작성하여라. 
// (단, 물건의 가격은 10원 이상 1000원 미만이며, 1원 단위는 고려하지 않는다.)

function solution(num){
	let answer= 0; // 거스름돈 개수 구하는 변수 선언
    getPrice = 1000 - num; // 거슬러야 하는 총 금액 선언
    // 받아야 할 동전의 개수를 남은 금액을 비교하며 계산
    if (getPrice >= 500) {
        getPrice = getPrice - 500
        answer += 1;    
    }
    if (getPrice >= 400) {
        getPrice = getPrice - 100
        answer += 1;
    }
    if (getPrice >= 300) {
        getPrice = getPrice - 100
        answer += 1;
    }
    if (getPrice >= 200) {
        getPrice = getPrice - 100
        answer += 1;
    }
    if (getPrice >= 100) {
        getPrice = getPrice - 100
        answer += 1;
    }
    if (getPrice >= 50) {
        getPrice = getPrice - 50
        answer += 1;
    }
    if (getPrice >= 40) {
        getPrice = getPrice - 10
        answer += 1;
    }
    if (getPrice >= 30) {
        getPrice = getPrice - 10
        answer += 1;
    }
    if (getPrice >= 20) {
        getPrice = getPrice - 10
        answer += 1;
    }
    if (getPrice >= 10) {
        getPrice = getPrice - 10
        answer += 1;
    }
	return answer; // answer 반환, 거스름 주는 동전 총 개수
}
let num1 = 160;
console.log(solution(num1)) // 8
// let num2 = 900;
// let num3 = 550;
// let num4 = 320;
// console.log(solution(num2)) // 1
// console.log(solution(num3)) // 5
// console.log(solution(num4)) // 6

먼저 거슬러야 할 금액을 계산하기 위해서 getPrice 변수를 선언 해 1000원에서 지불 해 물건의 금액을 빼면 그게 곧 거스름 돈 금액이다. 그리고 나서 거스름 돈 금액을 각각 500, 100, 50, 10원씩 빼면서 거스름 받아야 할 남은 금액과 비교해 동전을 개수를 체크를 하였다.
예를 들어 물건 금액이 160원이면 거스름 돈은 840원 이기에 맨 위 if문부터 순차적으로 내려와서 조건에 맞으면 개수를 1씩 올리면 된다. 먼저 500 이상일때 조건이 성립 되기에 카운트를 1 올렸다. 기존 500원은 빠지고 남은 금액은 340원 이니까 300부터 100까지 순차적으로 모든 조건을 총족해서 3을 추가적으로 올려 4가 된다. 그렇게 또 빼서 남은 금액은 40원이 되었으므로 40부터 10까지 모두 수행을 했기 때문에 4를 추가적으로 올려 최종적으로 8이 출력이 된다. 이는 500원 1개, 100원 3개, 50원 0개, 10원 4개를 받았고, 1+3+0+4를 모두 더하면 8개 이기에 8이 출력이 되었다.

사실 지금 내가 푼 방식은 약간 무식하게 if문만 일일히 체크해서 풀어서 효율성은 좋지 않았을 것이다. 분명히 이거 보다 더 간단하게 푸는 방식이 존재 했을 것으로 예상이 되었는데, 시험 당시에는 살짝 긴장해서 그런지 이렇게 if문만 10개 써서 모든 경우의 수를 다 일일히 따지면서 풀었기 때문에 이 부분은 아쉬웠다.

2. 동그라미 엑스로 숫자를?(중)

문제 설명, 답안 및 풀이

// ## 중. 동그라미 엑스로 숫자를?

// "OOXXOXXOOO"와 같은 OX문의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 
// 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

// "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

// OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

// (단,  OX문의 결과는 0보다 크고 80보다 작은 문자열이 주어진다. 또한 문자열은 O와 X만으로 이루어져 있다.)

function solution(str){
	let answer= 0; // 최종 점수 변수 선언
    let comboCorrect = 0; // 문제 연속 정답 점수 변수 선언
    // 각 인덱스 마다 분석
    for (let i = 0; i < str.length; i++) {
        // 정답일때는 comboCorrect 1점씩 올려주고 최종점수 반영
        // 오답이면 연속 정답 점수 변수는 0으로 변경
        if (str[i] === 'O') {
            comboCorrect += 1;
            answer = answer + comboCorrect;
        } else {
            comboCorrect = 0;
        }
        
    }
	return answer; // 최종 점수 반환
}
let str="OXOOOXXXOXOOXOOOOOXO";
console.log(solution(str)) // 27
// let str2= "OOXXOXXOOO"
// let str3= "OXOXOXOXOXOXOX"
// let str4= "OOOOOOOOOO"
// console.log(solution(str2)) // 10
// console.log(solution(str3)) // 7
// console.log(solution(str4)) // 55

먼저 최종점수를 나타내는 answer 변수를 선언 했고, 정답을 맞추거나 혹은 연속으로 맞추면 점수를 주는 comboCorrect 이라는 변수를 추가적으로 선언하였다. for문으로 돌려 모든 문자열 하나마다 O와 X를 체크를 하였고, 만약 O(정답)이라면 해당 점수를 반영을 해야 하는데 여기서 연속해서 점수를 맞추면 1점씩 더 가산해서 출력하기 위해서 comboCorrect += 1를 반영 후 answer에다 더해 줬다. 만약 중간에 X(오답)이라면 해당 문제 점수를 초기화 해야 하기 때문에 comboCorrect = 0으로 되돌렸다.
예시를 보면 "OXOOOXXXOXOOXOOOOOXO"이라는 것을 볼 수 있는데, 첫번째 문제는 맞췄기에 comboCorrect는 1 올리고 1점 추가한다. 2번째 문제는 틀렸기에 comboCorrect는 다시 0으로 맞추고 넘어간다. 3~5문제를 보면 3연속으로 정답을 맞췄는데 이러면 comboCorrect는 각각 1,2,3이 각각 출력되고 모두 더해서 6을 추가해 7이 된다. 이런식으로 해당 문자열 대로 풀게 되면 1+1+2+3+1+1+2+1+2+3+4+5+1=27이게 되므로 27이 출력하게 된다.

첫번째 문제랑은 다르게 두번째는 뭔가 정석적으로 풀은 것 같다. 적절하게 for문을 사용해서 각 문자마다 O,X인지 판단하였고, 정답이면 해당 문제 점수를 반영하고 그대로 더해주면 되었다. 다시 말해 이 문제는 중간에 한번도 틀리지 않고 연속해서 정답을 많이 맞출수록 고득점을 얻는 알고리즘 문제였다.

3.지뢰 탐지가 필요해!(상) (못 푼 문제)

문제 설명, 답안 및 풀이

// windows에서 지원하는 지뢰 찾기 게임을 한번쯤은 해 보았을 것이다. 
// 특히 르탄이는 지뢰찾기의 매니아로 알려져 있다. 
// 지뢰 찾기 map은 N*N의 정사각형 모양으로 각 칸에는 숫자가 들어가 있거나 지뢰가 들어가 있다. 
// 빈 칸에는 숫자 0이 들어있다고 생각하자.

// map의 어떤 칸에 적혀 있는 숫자는, 그 칸과 인접해 있는 여덟 개의 칸 중에서 지뢰가 들어 있는 칸이 몇 개인지를 나타내 준다. 
// 물론 인접한 칸이 map 내부에 있는 경우에 대해서만 생각하면 된다. 예제를 보면 더 잘 이해할 수 있을 것이다.

// 이번 문제는 조금 업그레이드 된 지뢰 찾기로, 한 칸에 한 개의 지뢰가 있는 것이 아니고, 
// 한 칸에 여러 개(1 이상 9 이하)의 지뢰가 묻혀 있는 게임이다. 따라서 map의 어떤 칸에 적혀 있는 숫자는, 
// 그 칸과 인접해 있는 여덟 개의 칸들에 들어 있는 지뢰의 총 개수가 된다.

// 이미 windows 지뢰찾기 같은 것을 마스터한 르탄이는, map에서 지뢰에 대한 정보만이 주어졌을 때, 
// 르탄이는 map을 완성하고 싶다고 한다. N과 지뢰의 위치가 주어졌을 때, 르탄이를 도와서 지뢰 찾기 map을 완성하는 프로그램을 작성하시오.

// (단, 1 ≤ N ≤ 1,000 이며, 배열의 각 요소에는 지뢰 찾기 map에 대한 정보가 주어지는데 '.' 또는 숫자로 이루어진 문자열이 들어온다. 
// '.'는 지뢰가 없는 것이고 숫자는 지뢰가 있는 경우로 그 칸의 지뢰의 개수이다. 한 줄은 N개의 문자로 이루어져 있다.)

// ## 출력

// N개의 줄에 걸쳐서 완성된 지뢰 찾기 map을 출력한다. 지뢰는 '*'로 출력하며. 
// 10 이상인 경우는 'M'(Many)으로 출력하면 된다. map은 숫자 또는 'M' 또는 '*'로만 이루어져 있어야 한다.

function solution(N, arr1){
	let x = [1, -1, 0, 0, 1, 1, -1, -1];
	let y = [0, 0, 1, -1, 1, -1, 1, -1];

	let answer=[];
	return answer;
}
let N = 5;
let arr1=  [['1', '.', '.', '.', '.'], 
		    ['.', '.', '3', '.', '.'], 
			['.', '.', '.', '.', '.'],
			['.', '4', '.', '.', '.'], 
			['.', '.', '.', '9', '.']]; 
console.log(solution(N, arr1))

// int N = 4; 
// char[][] chars= 
// {{'2', '.', '.', '.',},        
//  {'.', '.', '9', '.'},        
//  {'.', '3', '.', '2'},        
//  {'.', '4', '.', '.'}};	
// [[*, M, 9, 9], 
// [5, M, *, M], 
// [7, *, M, *], 
// [7, *, 9, 2]]

일단 이 문제는 끝내 못 푼 문제라서 문제랑, 예시, 초기 세팅 코드만 올렸다.
일단 코드는 비록 끝내 못적었지만, 문제 파악정도는 이해 했다. 기존의 지뢰찾기랑은 살짝 변형한 문제였다. 맨 아래에 있는 예시에 있는 것만 얘기 하자면 다음과 같이 지뢰가 설치 되어 있다. N의 숫자에 따라 N x N 크기의 맵이 생성이 된다. 그리고 나서 각 지역마다 다음과 같은 지뢰가 있다고 가정한다. 지역에 적힌 숫자는 그 지역에는 해당 숫자 만큼 지뢰가 매설되어 있다. '.'인 곳은 지뢰가 없는 곳이다. 이를 토대로 정답출력을 하려면 다음과 조건이 필요하다.
1. 그 위치에 지뢰가 있다면 해당 지역은 별을 찍어준다.
2. 해당 위치에는 지뢰는 없지만 해당 위치 기준으로 바로 한칸 주변으로 8방향 모두를 탐색해서 지뢰가 있다면 그 지뢰 수를 모두 합한 숫자를 보여 준다. 주변에 지뢰가 하나도 없으면 0 출력하고, 10개 이상이면 M을 출력 하는 것이다.
따라서 저기 있는 5x5 예시를 따지면 다음과 같은 결과가 나오게 된다.
지뢰 설치가 된 지역과 그 지역의 매몰된 지뢰 수
['1', '.', '.', '.', '.'],
['.', '.', '3', '.', '.'],
['.', '.', '.', '.', '.'],
['.', '4', '.', '.', '.'],
['.', '.', '.', '9', '.']
그 지뢰를 토대로 지뢰가 있는 곳은 별 표시, 없으면 주변 지뢰 개수를 표시
['*', '4', '3', '3', '0'],
['1', '4', '*', '3', '0'],
['4', '7', '7', '3', '0'],
['4', '*', 'M', '9', '9'],
['4', '4', 'M', '*', '9']
즉, 원하는 답은 다음과 같이 이걸 표시를 하면 되는 것인데, 접근까지는 했지만 결국 구현을 하지 못해서 풀지 못했다.

알게 된 점

오늘 시험을 토대로 이렇게 내가 푼 문제를 복습을 할 겸 문제 푼 것을 직접 블로그에 올렸다. 이제는 기초적으로 for문과 if문을 사용 하는 방법은 확실히 많이 터득 된 것 같다. 다만 1, 2번문제를 보면 알겠지만 함수의 메소드는 하나도 안 쓴걸 볼 수 있었는데, 아직 그런 부분을 응용 하는 건 여전히 적응을 하지 못한 점은 아쉬운 것 같다. 이 부분은 계속해서 공부를 해야 할 부분인 것 같다. 특히나 마지막 상 난이도였던 지뢰찾기 문제는 아예 손을 못 댄건 아니지만 결국 끝내 알고리즘 구현은 못한 것이 아쉽다. 실제로 지뢰찾기 푼 사람도 우리 기수에서는 7~80명중에서 소수 몇 명이 풀었다고 했는데, 그만큼 실제로 어려웠던 문제였고, 결론적으로 상대적으로 쉬웠던 하, 중난이도 문제만 제대로 풀면 합격 할 수 있던 시험이였다.
(PS. 21일 저녁 추가 : 사실 시험은 합불 여부는 없었고, 시험만 봤으면 전원 합격이였다고 한다)

앞으로 할 일

내일부터는 지옥의 알고리즘 문제 풀이는 잠깐 멈추고, 다시 문법 이론 공부를 진행한다. 물론 코딩테스트 문제는 여전히 있지만, 기존 문법 이론 공부 위주로 하게 된다. 기존보다 심화적인 이론을 3일동안 배우게 될 텐데, 최대한 이해 많이 할 수 있게 노력해봐야 겠다.

profile
향해 13기 node.js 백앤드

0개의 댓글