알고리즘 코딩테스트 01 - 문자열 정수로 바꾸기, 서울에서 김서방 찾기, 수박수박수, 가운데 글자 가져오기(JS)

조아라·2024년 10월 10일
2
post-thumbnail

알고리즘이란?

컴퓨터가 문제를 해결 할 수 있도록 절차나 방법을 자세히 설명하는 과정
개발자는 컴퓨터가 효율적으로 동작하도록 명령을 내려야 하고 이때 필요 한 것이 알고리즘

코딩테스트

코드로 이루어지는 모든 형태의 테스트
통상적으로는 알고리즘 실력을 평가하는 테스트

문제 풀이

function checkTruthiness(questionLabel, value, userGuess) {
  const isTruthy = Boolean(value);
  const isCorrect = isTruthy === userGuess;
  
  console.log(`\n%c${questionLabel}`, 'color: #4287f5; font-weight: bold;');
  console.log(`%c값: ${value}`, 'color: #6c757d;');
  console.log(`%c실제 결과: ${isTruthy ? 'true' : 'false'}`, 'color: #28a745;');
  console.log(`%c당신의 답변: ${userGuess ? 'true' : 'false'}`, 'color: #ffc107;');
  console.log(`%c정답 여부: ${isCorrect ? '정답입니다!' : '틀렸습니다!'}`, 
              `color: ${isCorrect ? '#28a745' : '#dc3545'}; font-weight: bold;`);
  console.log('%c------------------------', 'color: #6c757d;');
}

// '답변입력' 부분에 true 또는 false를 입력해 주세요
checkTruthiness('1번 문제', 0, false);
checkTruthiness('2번 문제', 'false', true);
checkTruthiness('3번 문제', null, false);
checkTruthiness('4번 문제', ' ', true);
checkTruthiness('5번 문제', [], true);
checkTruthiness('6번 문제', {}, true);
checkTruthiness('7번 문제', -1, true);
checkTruthiness('8번 문제', '', false);
checkTruthiness('9번 문제', NaN, false);
checkTruthiness('10번 문제', Infinity, true);

내가 여기서 틀렸던 부분은 바로 2번 문제 false라고 적혀있다고 false를 입력했다. 하지만 작은따옴표 안에 있기때문에 문자열이므로 true !!!!!!

다음 문제는 가위 바위 보

function rockPaperScissors(a, b) {
	if (a === b ) {
      return '무승부';
} else if (
  (a === '가위' && b === '보'),
  (a === '바위' && b === '가위'),
  (a === '보' && b === '바위')
 ) { return 'a 승리';
   } else {
     return 'b 승리'
   }
}

// 9가지 경우의 수 테스트
console.log(rockPaperScissors('가위', '가위') === '무승부');
console.log(rockPaperScissors('가위', '바위') === 'b 승리');
console.log(rockPaperScissors('가위', '보') === 'a 승리');
console.log(rockPaperScissors('바위', '가위') === 'a 승리');
console.log(rockPaperScissors('바위', '바위') === '무승부');
console.log(rockPaperScissors('바위', '보') === 'b 승리');
console.log(rockPaperScissors('보', '가위') === 'b 승리');
console.log(rockPaperScissors('보', '바위') === 'a 승리');
console.log(rockPaperScissors('보', '보') === '무승부');

아까 강의 중에는 진짜 모든 경우의 수를 if ~ else if 로 썼다. 하지만 OR AND 함수로 푸니까 쉽길래 외워두니까 지금 안보고 코드를 치는데도 술술 친 거 같다.

하지만 이것도 조건이 길어서 가독성이 안좋다고 삼항연산자로 바꿔 쓸 수 있었다.

function rockPaperScissors(a, b) {
    if (a === b) return '무승부';
    return ['가위-보', '바위-가위', '보-바위'].includes(a+'-'+b) ? 'a 승리' : 'b 승리';
}

여기서 진짜 소름이 돋았다 이 생각을 왜 못했지? 하고서..includes 메서드로 -까지 제외 한 게 진짜 놀라웠는데 이건 내가 많은 연습이 필요 할 것 같다.

// (조건) ? (조건이 true일 때 보여줄 값) : (조건이 false일 때 보여줄 값)

return ['가위-보', '바위-가위', '보-바위'].includes(a+'-'+b) ? 'a 승리' : 'b 승리';

그러고 나서 코딩 테스트 숙제 4개를 내주셨는데,

01 문자열을 정수로 바꾸기

문제 설명
문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.

제한 조건
s의 길이는 1 이상 5이하입니다.
s의 맨앞에는 부호(+, -)가 올 수 있습니다.
s는 부호와 숫자로만 이루어져있습니다.
s는 "0"으로 시작하지 않습니다.
입출력 예
예를들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩니다.
str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.

나는 이거에 대해서 코드를 이렇게 두가지로 짜보았다.

function solution(s) {
    return Number(s);
}

// 이것과

function solution(s) {
    return +s; 
}
// 앞에 +연산자를 넣으면 자바스크립트가 계산을 하기 위해서 자동으로 문자열을 
//숫자로 만들어주는 것을 이용했다.

02 서울에서 김서방 찾기

문제 설명
String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

제한 사항
seoul은 길이 1 이상, 1000 이하인 배열입니다.
seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
"Kim"은 반드시 seoul 안에 포함되어 있습니다.

function solution(seoul) {
    for (let i = 0; i < seoul.length; i++) {
        if (seoul[i] === 'Kim') return `김서방은 ${i}에 있다`
    }
}

이건 일단 seoul이라는 배열을 돌면서 "Kim"있는지 확인하게 for문을 이용했다.
i번째 요소가 "kim"이라면 김서방은 ${i}에 있다 문자열을 반환하게 만들어 줬다.

03 수박수박수박수박수

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

제한 조건
n은 길이 10,000이하인 자연수입니다.

이건 좀 고민을 많이 했다.

function solution(n) {
    var answer = '';
    
    for (i = 0; i < n; i++) {
        const subak = (i % 2) === 0 ? '수' : '박';
        answer += subak;
    }
    return answer;
}

일단 '수'랑 '박' 번갈아 가면서 출력하는 것이 목표다. 일단 결과 문자열 담을 answer를 만들어주고 for문을 이용해서 길이가 n 이니까 n보다 작게 i++를 주었다.
그러고나서 i를 나누었을때 나머지가 0이면 짝수니까 수가 나오게, 그게 아니라면 박이나오게!
그걸 answer에 더해주고 반환했다.

04 가운데 글자 가져오기

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

제한사항
s는 길이가 1 이상, 100이하인 스트링입니다.
입출력 예
s return
"abcde" "c"
"qwer" "we"

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

이건 진짜 머리가 아팠다,, 일단 먼저 앞에서처럼 answer를 빈 문자열을 주고, 만약에 글자가 짝수인덱스라면 이렇게 홀수인덱스라면 이렇게 주고 싶은데
그래서 일단 if문에 문장의 길이를 나눴을때 나머지가 0이라면을 조건식으로 주고
예를들어 abcd라면 0123 인덱스가 총 네개, 2로 나누면 2 '2'를 가르킨다. 하지만 내가 가져오고 싶은건 1이니까 -1해주고, 인덱스 2를 가져와주기위해 더했다.

그러고 나서 이제 홀수....
abcde라면 01234 인덱스 5 나누기 2를 하면 2.5다..... 2.5 인덱스가 어딨는데 세상에...
그러다가 찾아본게 반내림 방법 Math.floor였다. 그걸로 반을 올리면 인덱스는 2로간다.
그렇게 해서 값을 리턴했다.


진짜 어렵고 머리 아프고 처음하는 코테여서 진짜 내가 너무 아무것도 모르나도 생각이 들긴했다. 문제를 이해하는 시간이 더 길었던것같다. 이걸 어떻게 사용하면 좋지를 고민하는게 힘들었다. 그래도 01 02 예제는 괜찮았는데 03 04부터는 약간 으으 하면서 한 것 같다.

profile
끄적 끄적 배운 걸 적습니다 / FRONT-END STUDY VELOG

0개의 댓글