[23.10.16] TIL

yy·2023년 10월 16일

개발일지

목록 보기
3/122

오늘 한 일

  1. 깃허브를 commit, branch, merge 체험
  2. javascript 강의 1주차 복습
  3. 코딩테스트 풀기
    https://school.programmers.co.kr/learn/courses/30/lessons/12916
    https://school.programmers.co.kr/learn/courses/30/lessons/76501
  4. 내일부터 만들 야구게임 혼자 코딩


코딩테스트

코딩 테스트 두번째 푸는 문제였는데 지난번보다 훨씬 간결한 코드를 썼다.

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

처음풀땐 이렇게 방구를 덕지덕지 붙인 느낌이었다면



오늘은 toUpperCase()로 대문자를 만들고 잘라서 길이를 구하므로써 해결할 수 있었다.

function solution(s) {
    let sSum = s.toUpperCase().split("P").length-1;
    let ySum = s.toUpperCase().split("Y").length-1;

    return (sSum===ySum) ? true : false;
};


2. 음양 더하기

처음엔 true를 +로, false를 -로 바꿔버리고, map, filter와 같이 두 배열을 조합해서 새로운 배열을 만들고 배열의 요소들끼리 합계를 구하는 코드를 만들려고 노력했으나 너무 힘들어서 이게 맞는거야? 싶어서 다른 사람이 푼 풀이를 보니 진짜 너무 간단하게 풀어서 그게 기억에 남았었다. 그래서 이번에 그 기억을 떠올려 해결했다.

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




야구게임 혼자 코딩

야구게임이 무엇인고 하면 아래와 같다.

- 컴퓨터는 0과 9 사이의 서로 다른 숫자 3개를 무작위로 뽑습니다. (ex) 123, 759
- 사용자는 컴퓨터가 뽑은 숫자를 맞추기 위해 시도합니다.
- 컴퓨터는 사용자가 입력한 세자리 숫자에 대해서, 아래의 규칙대로 스트라이크(S)와 볼(B)를 알려줍니다.
    - 숫자의 값과 위치가 모두 일치하면 S
    - 숫자의 값은 일치하지만 위치가 틀렸으면 B
- 기회는 무제한이며, 몇번의 시도 후에 맞췄는지 기록됩니다.
- 숫자 3개를 모두 맞춘 경우, 게임을 종료합니다.
실행환경 예상 화면
컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!
1번째 시도 : 134
0B0S
2번째 시도 : 238
1B1S
3번째 시도 : 820
2B1S
4번째 시도 : 028
3B
5번째 시도 : 280
3S
4번만에 맞히셨습니다. 
게임을 종료합니다.

접근방법은 이랬다.
1. 서로 다른 랜덤한 숫자(getRandomNum)를 만든다. ~~(Math.random() * 10)
2. 사용자 입력값(getInputNum)을 받는다. ( prompt로 입력값 받기 _ 입력값 유효성 검사)
3. 입력값과 랜덤숫자를 비교한다.

  • 조건문 : getInputNum의 숫자가 getRandomNum안에 숫자가 있는가?
  • (true) 조건문 : getInputNum의 숫자와 getRandomNum의 숫자의 인덱스가 같은가?
  • (true) s++, count++ // (false) b++
  1. propmt는 불러와서 사용해야한다.

터미널창에서 prompt를 사용하기 위한 방법

1. 터미널에 prompt-sync 설치

npm install prompt-sync

2. 코드영역에 넣기

const prompt=require("prompt-sync")({sigint:true}); 

**만들어본 코드**(물론 혼자 다 만들지는 못하고 블로그의 힘을 빌렸다.)

1. 서로 다른 랜덤 숫자 생성

let answer = function () {
    //1-1. 랜덤 숫자 뽑기
    let arr = [];
    while (arr.length < 3) {
        let randomNum = ~~(Math.random() * 10);
        if (!arr.includes(randomNum)) {
            arr += randomNum;
        };
    };
    //1-2. 답안
    let count = 0;
    console.log(`컴퓨터가 숫자(${arr})를 생성하였습니다. 답을 맞춰보세요!`);
    checkNum(arr, count);
    };

2. 사용자 입력값 받기

let getInputNum = function () {
    let value = prompt("숫자 3개를 입력해주세요");
    if (value === null) {
        console.log("다시 입력해주세요");
        return getInputNum();
    } else if (value.match(/\D/)) {
        console.log("3자리 수의 숫자만 입력해야합니다.");
        return getInputNum();
    } else if (value.length > 3) {
        console.log("입력한 값의 길이는 3을 넘을 수 없습니다.");
        return getInputNum();
    }
    return value;
};

3. 랜덤 숫자와 input 숫자 비교하기

let checkNum = function (randomNum, count) {
    let inputNum = getInputNum();
    count++;
    console.log(`${count}번째 시도 : ${inputNum}`);
    let sCount = 0;
    let bCount = 0;
    let str=0;
    inputNum.split("").forEach((e, idx) => { //forEach is not a function: 문자열은 배열이 아니라서 생김=> split로 나눠서 배열로 만들면 해결
        if(randomNum.indexOf(e)===idx){ //인덱스값 반환하여 맞는지 확인
            sCount++;
        } else if (randomNum.split('').includes(e)){
            bCount++;
        };
    });
    if (sCount === 3) {
        str = `${sCount}S`
    } else if (bCount === 3) {
        str = `${bCount}B`
    } else { 
        str = `${bCount}B${sCount}S`
    };
    console.log(str);
    (randomNum !== inputNum) ? checkNum(randomNum, count) : console.log(`${count}번만에 맞히셨습니다.\n게임을 종료합니다.`);

4. 답안 호출

answer()
profile
시간이 걸릴 뿐 내가 못할 건 없다.

0개의 댓글