[프로그래머스/코딩테스트 모음/Javascript] 6

TED·2023년 8월 19일
0

Javascript CodingTest

목록 보기
6/63
post-thumbnail
  • 페어 프로그래밍이 진행중이라 최대한 다른사람에게 이해가 될수있게끔 리뷰를 하려고 노력하면서 풀었는데
    그냥 문제자체가 어려워서 너무 힘들었다,,,,,,

<오늘의 문제>

🌟 = 내가 생각한 난이도있는 풀이
1. 두 정수 사이의 합 1레벨
2. 콜라츠 추측 1레벨
3. 서울에서 김서방 찾기 1레벨
4. 나누어 떨어지는 숫자 배열 1레벨
5. 음양 더하기 1레벨

1. 두 정수 사이의 합

function solution(a, b) {
    var answer = 0;
    
    if (a >= b) {    // 예시 -> (5, 3)
        for (let i = b; i <= a; i++) {
            answer += i; // 3 + 4 + 5
        }
    } else {
        for (let j = a; j <= b; j++) { // -> if(a <= b)   // 예시 -> (3, 5)
            answer += j; // 3 + 4 + 5
        }
    }    
     return answer;
}
  • 나의 풀이
    : a와 b값, 그리고 그 사이값을 모두 더한값을 출력하는 문제였는데 for문 초기값에 0이 아닌 다른값을 넣는게 익숙하지 않아서 생각이 오래걸렸다.
    코드만 보면 이해가 바로안되서 ㅠㅠ,, 주석으로 예시를 넣어가면서 코드를 짰다. forEach문을 좀 썼어야했는데 자꾸 생각을 못하네..

2. 콜라츠 추측

function solution(num) {
    let answer = 0;
    
    if(num === 1) return 0;
    
    while (num !== 1) {
        if (num % 2 == 0){
            num /= 2;
        } else {
            num = (num * 3) + 1;
        }
        answer += 1;
    }
    if (answer >= 500) {
        return -1;
    }
        return answer;
}
  • 나의 풀이
    : 일단 처음보는 정의? 추측을 받아드려야해서 겁을 먹었었는데 생각보다 간단했지만, 조건이 4개나 있어서 어떻게 정리해야할지 계속 고민했다. if(num === 1) return 0; 값을 제일 마지막에 넣었었는데 실행속도가 10초가 넘는다고 fail이 나서 맨위에 명시하고 시작했더니, 성공했다... 그렇다고해서 이게 맞는걸까? ㅠㅠ...하핳ㅎ
    num값이 1인 경우는 0으로 return 해야했기때문에 나머지 경우의 수는 1아닌 경우로 시작하고 조건을 걸었다.
    answer 값에 카운터를 걸었고, 500이상의 값이나오면 -1로 retrun하는 값은 마지막에 따로 if값을 넣어줬다.
function solution(num) {
    var answer = 0;
    if(num === 1) return 0;
    
    while(num !=1 && answer !=500){
        num%2==0 ? num = num/2 : num = num*3 +1;
    answer+=1;
  } 
    return num === 1 ? answer : -1;
}
  • 다른 사람 풀이
    : while의 조건식에 저렇게 두가지 조건을 넣어서 삼항연산자를 사용해서 간단하게 코딩되었다.
    return num === 1 ? answer : -1; 이 부분이 이해가 어려웠는데, 결국 반복문이 모두 끝난 뒤 answer값이 1일경우에 카운팅되는거고, 아닌경우엔 -1이되는거니까 !=500의 조건을 벗어난 값들은 -1을 출력하게된다는... 의미인데 아 어렵네 ㅠㅠ

3. 서울에서 김서방 찾기

function solution(seoul) {
    var answer = '';
    
    for(let i = 0; i < seoul.length; i++) {
        if (seoul[i] === "Kim")
            answer = "김서방은 " + seoul.indexOf('Kim', 0) +"에 있다" // 그냥 i만 써도된다...허무
        // `` 을 생각해보자 ${i} // indexOf()
    }
    
    return answer;
}
  • 나의 풀이
    : 뭔가 한번에 너무 쉽게 풀려서 간만에 희열이 돋아났던 문제였다 ㅎㅎ..
    배열 seoul 의 요소 값중에 Kim값이 있으면 위치를 나타내주는 문젠데 seoul.indexOf('Kim', 0) 에서 0값은 인덱스[0]부터 찾는다는 의미다.
    사실 seoul.indexOf('Kim', 0) 말고 그냥 i만 써도 답은 도출된다 ㅎㅎ.. 백틱으로 ${i}값을 문자와 써도 이뻤을텐데 ㅎㅎ..

4. 나누어 떨어지는 숫자 배열

function solution(arr, divisor) { // divisor = 제수, 나누는 값
    var answer = [];
    
    for (let i = 0; i < arr.length; i++){
        if(arr[i] % divisor === 0)
           answer.push(arr[i]);
        
    } if (answer.length === 0){ // -> 나누어 떨어지는 요소가 없으면 = return 배열에 요소가 없으면 !
           answer.push(-1);
    }
    answer.sort((a, b) => a - b);
    return answer;
}
  • 나의 풀이
    : 어렵게 생각했었는데 간단한 문제였다..그래도 어렵지만?? ㅠㅠㅠ
    일단 arr[i]값에 divisor값을 나눈값이 0이 나오면 .push()로 배열값을 넣어줬고,
    answer.length === 0 이라는 의미는 나눈값이 0이되는게 없으면! 이라는 뜻으로 -1값을 넣었다.
    그리고 조건에 오름차순을 원해서 a - b ! 내림차순은 b - a !

5. 음양 더하기

function solution(absolutes, signs) {
    var answer = 0;

    // 2. 두 배열을 비교해 가면서 값을 더하거나 빼줄 것
    // 2-1. absolutes, signs 두 배열은 크기가 같음
    for (var i = 0; i < absolutes.length; i++){
    // 부호 (+, -) 에 따른 처리
        if(signs[i] === true){ // 값이 true인 경우 (+)
            answer += absolutes[i];
        }else if (signs[i] === false) {
            answer += (-1) * absolutes[i]; // 값이 false인 경우 (-)
        }
    }
    return answer;
}    
  • 나(최원장 튜터님)의 풀이
    : 숙제로 풀었던 문제인데, 최원장님의 완벽한 주석과 함께 코딩했다. ㅎㅎ...ㅎ.ㅎ..
    결국 sign 값에 따라 + 냐 - 냐 answer값이 정해지는데 음수값을 내기위해서 answer += (-1) * absolutes[i]라고
    코딩한부분은 answer -= absolutes[i] 로도 같은 결과가 나왔다.. 오잉..answer값이 0으로 초기값이 잡히기 때문인가보다..?
profile
컴맹 개발 입문자

0개의 댓글