1. 문제점

프로그래머스 알고리즘 문제풀이 - 자바스크립트 [ 가위바위보 ]

2. 시도해본 것들

처음 봤을땐 막막했다. 문제 풀때마다 왜 이러지ㅋㅋㅋ

일단 모두 이기는 경우니까 경우의 수는 3개

그럼 for문 안에서 if문으로 걸러내야 겠다고 생각했다.

 

3. 해결과정

일단 문제를 글로 쓰면서 이해했다.

 

//  가위는 2, 바위는 0, 보는 5 손가락 갯수
// 가위는 2 > 보 5
// 바위는 0 > 가위 2
// 보는 5 > 바위 0

 

좀 알아보긴 어렵지만 이렇게 써서 문제를 이해하고 코드로 구현해봤다.

4. 알게 된 점

 

나의 문제풀이

function solution(rsp) {
    var answer = '';
//  가위는 2, 바위는 0, 보는 5 손가락 갯수
// 가위는 2 > 보 5
// 바위는 0 > 가위 2
// 보는 5 > 바위 0
    
    for(i=0; i<rsp.length; i++){
        if(rsp[i] == "5"){
           answer += 2;
        } else if (rsp[i] == "0"){
           answer += 5;
        } else {
           answer += 0;
        }
    }
    
    return answer;
}

타입스크립트면 어림도 없겠지만,

문자열도 배열처럼 사용할 수 있다는걸 이전에 배워서

타입변환없이 answer에 더했더니 정답이었다.

 

남의 문제풀이

/*
 가위는 2 바위는 0 보는 5
*/
function solution(rsp) {
    let arr = {
        2: 0,
        0: 5,
        5: 2
    };
    var answer = [...rsp].map(v => arr[v]).join("");
    return answer;
}

객체로 만들어서 map을 이용한 풀이법

깔끔하고 이해하기 쉽다. for문으로 모든걸 풀고 있지만

for문 없이 이런식으로 풀고 싶다ㅠㅠㅠ

이걸 봤으니 한번 머리에 외워두고 당장 코드로 적어봐야겠다.

728x90

1. 문제점

프로그래머스 알고리즘 문제풀이 - 자바스크립트 [ 암호해독 ]

2. 시도해본 것들

배열이면 쉬울텐데, 배열로 하고 싶지 않았다.

매번 배열<=>문자열 왔다갔다하는게 귀찮았기 때문..

이번엔 문자열만으로 원하는 단어만 뽑아내보기로 했다.

 

3. 해결과정

첫번째 알파벳은 배열이라면 어떻게 구할까?

인덱스는 0부터 시작이니 code에서 -1만 하면 될것이다.

i = code-1;

그리고 code 만큼 더하면 의도대로 뽑아낼 수 있다.

 

4. 알게 된 점

 

나의 문제풀이

function solution(cipher, code) {
  var answer = "";
    for(i= code-1; i<cipher.length; i+=code ){
        answer += cipher[i];
    }
    return answer;
}

문자열을 배열처럼 생각하고 풀이했더니 통과되었다!

 

 

남의 문제풀이

unction solution(cipher, code) {
    return cipher.split('').filter((v,i)=>(i+1)%code===0).join('');
}

대부분 split , filter로 풀었는데

사실 뭔소린지 잘 모르겠다......

구글링해서 해석해야지

728x90

1. 문제점

프로그래머스 알고리즘 문제풀이 - 자바스크립트 [대문자와 소문자]

2. 시도해본 것들

 

문제를 보고 for문을 이용해

첫번째 인덱스가 대문자라면(if) 소문자로! 소문자라면(if) 대문자로!

노가다하기로 결심했다.

바꾸는 과정은 아는데 if문에서 소문자인지 대문자인지 어떻게 알 수 있을까..?

 

3. 해결과정

해결방법은 arr[i] 와 변환시켜둔 arr[i].toLowercase() 가 같은지 확인하면 되는 것 이었다.

배열값을 두고 이게 소문자로 변환시킨 배열값과 동일한가?

 

if( arr[i] == arr[i].toLowerCase() )

 

4. 알게 된 점

 

나의 문제풀이

function solution(my_string) {
    var answer = [];
    var arr = Array.from(my_string);
    for(i=0; i<my_string.length; i++){
        if(arr[i] == arr[i].toLowerCase() ){
           answer[i] = arr[i].toUpperCase()
        } else {
             answer[i] = arr[i].toLowerCase()
        }
    }
    return answer.join('');
}

이제 문자열 <=> 배열 왔다갔다 하는건 익숙해진듯 하다.

마지막 배열을 join('')까지 익숙해졌다.

 

 

남의 문제풀이

function solution(my_string) {
    var answer = '';
    for (let c of my_string) answer += c === c.toLowerCase() ? c.toUpperCase() : c.toLowerCase();
    return answer;
}

문자열만으로 해결

게다가 삼항연산자로 깔끔하게 해결되었다. 위와 같이 풀 수 있도록 연습해야지.

728x90

1. 문제점

프로그래머스 알고리즘 문제풀이 - 자바스크립트 [모음제거]

2. 시도해본 것들

문자열을 배열로 바꿔준후, for문에서 모음에서 해당하는 인덱스를 삭제했다.

function solution(my_string) {
    var answer = '';
    var arr = Array.from(my_string);
    for(i=0; i<my_string.length; i++){
        if (arr[i] === 'a' || arr[i] === 'e' || arr[i] === 'i' || arr[i] === 'o' || arr[i] === 'u'){
            arr.splice(i,1);
        }
    }
    return arr.join('');
}

근데 테스트 결과값이 이상하다.. 왜이러지?

모음이 짤리다 마는 결과값이 나왔다.

3. 해결과정

내 코드가 이상한건 없는것 같은데 뭐가 문제일까......?

사실 구글링으로 찾으려면 문제점을 알아야 물어볼 수 있을텐데,

알 수가 없어서 GPT에게 물어봤다.

for문을 반대로 돌리는 코드값을 줬다. 실행해보니 통과.

근데 왜 거꾸로 돌려야하는거지 궁금해서 추가질문을 했다.

4. 알게 된 점

 

나의 문제풀이

function solution(my_string) {
    var answer = '';
    var arr = Array.from(my_string);
    for(i=my_string.length-1; i>=0; i--){
        if (arr[i] === 'a' || arr[i] === 'e' || arr[i] === 'i' || arr[i] === 'o' || arr[i] === 'u'){
            arr.splice(i,1);
        }
    }
    return arr.join('');
}

문자열만으로 끝내고 싶었는데

아는 것이 없다보니 이런 유형 문제는

항상 문자열 <=> 배열을 왔다갔다하는 노가다로 풀게 된다ㅠㅠ

 

 

남의 문제풀이

function solution(my_string) {
    return my_string.replace(/[aeiou]/g, '');
}

깔끔하다. 이런식으로 풀고 싶었는데 정규표현식을 이렇게 쓸 수 있구나.

function solution(my_string) {
    return Array.from(my_string).filter(t => !['a', 'e', 'i', 'o', 'u'].includes(t)).join('');
}

필터도 사실 생각나긴 했는데 잘 몰라서 노가다해야지 했다.

근데 그냥 필터라는 함수에 익숙해질겸 한번 사용해볼껄 그랬다.

728x90

1. 문제점

프로그래머스 알고리즘 문제풀이 - 자바스크립트 [숨어있는 숫자의 덧셈(1)]

2. 시도해본 것들

처음에는 다음과 같이 코드를 작성했다.

typeof로 체크하여 숫자일 경우 덧셈하면 끝날지 알았는데

문자열 숫자는 문자열로 처리하기에 추가가 되지 않았다.

function solution(my_string) {
     var answer = 0;
     var num = Array.from(my_string);
     for(i=0; i<my_string.length; i++ ){
         if( typeof(num[i]) === 'number' ){
             answer += Number(num[i]);
         }
     }
     return answer;
}

3. 해결과정

isNaN(); (NaN을 가지고 있는지에 따라 true, false를 반환하는 함수)

이것을 이용해서 배열값이 숫자를 가지고 있는지 없는지를 판단하도록 했다.

4. 알게 된 점

 

나의 문제풀이

function solution(my_string) {
    var answer = 0;
    var num = Array.from(my_string); 
    for(i=0; i<my_string.length; i++ ){
        if( isNaN(Number(num[i])) == false ){ 
            answer += Number(num[i]); 
        }
    }
    return answer;
}

배열값을 숫자화 시킨다음 isNaN인지 판단한다.

true면 당연히 숫자가 아니므로 넘겨야하고,

false면 숫자이기에 answer에 더해주면 된다.

 

 

남의 문제풀이

function solution(my_string) {
    return my_string.match(/[0-9]/g).reduce((a,b) => parseInt(a)+parseInt(b));
}

정규식을 이용한 풀이방법..내겐 어렵다..ㅠㅠ

728x90

1. 문제점

프로그래머스 알고리즘 문제풀이 - 자바스크립트 [개미군단]

2. 시도해본 것들

우선 문제를 보자마자 게임알고리즘 짜는것 같아서 살짝 두근두근 했다.

문제를 이해했을땐 역시 '이건 어떻게 풀지...?'

몇분 고민하다가 장군개미5부터 구하면 어떻게든 되지 않을까라고 생각했다.

3. 해결과정

count = parseInt(hp/5)

parseInt() - 문자열을 정수로 바꾸는 함수입니다.

나누기후에 몫을 구하려고 찾았는데,이 함수를 이용하면 장군개미 수를 구할 수 있었다(몫 구하기)

 

그럼 나머지 3짜리 병정개미와 1짜리 일개미는 어떻게 구하지....?

모르겠다 노가다해야지ㅠㅠㅠ

 

4. 알게 된 점

 

나의 문제풀이

function solution(hp) {
    var answer = 0;
    var count = 0;
    //장군5 병정3 일1 ==>최소한 병력
    count = parseInt(hp/5) //장군개미 숫자
    if( (hp-(count*5)) === 4){ //나머지는 4,3,2,1 이니까 노가다..
        count += 2
    } else if ( (hp-(count*5)) === 3 ){
        count += 1
    } else if ( (hp-(count*5)) === 2 ){
        count += 2
    } else if ( (hp-(count*5)) === 1 ){
        count += 1
    } else {
        count;
    }
    return count;
}

 

 

남의 문제풀이

function solution(hp) {
    const 장군개미 = Math.floor(hp / 5);
    const 병정개미 = Math.floor((hp - (장군개미 * 5)) / 3);
    const 일개미 = hp - ((장군개미 * 5) + (병정개미 * 3));
    return 장군개미+병정개미+일개미;
}

 

이게 내가 풀고 싶었던 풀이방법이다ㅠㅠ

병정개미는 나머지값을 나눠서 구할 수 있었고, (3보다크면 1 작으면 0)

일개미는 나머지를 구했으니 총합에서 장군+병정을 뺀 값

 

한줄만에 멋지게 풀순 없지만

저런식으로 깔끔하게 풀고 싶었는데 아쉽다.

728x90

1. 문제점

프로그래머스 알고리즘 문제풀이 - 자바스크립트 [제곱수 판별하기]

2. 시도해본 것들

2의 제곱은 4..

4의 제곱은 16.. 이걸 어떻게 해야하지...? 고민했다

당연히 답은 안나왔다ㅠㅠ완전 수학문제자너!

3. 해결과정

Math.sqrt(n) 루트 또는 제곱근

갑자기 중학수학의 개념을 찾아봤다ㅋㅋㅋㅋ

 

루트 또는 제곱근을 씌웠다면 무조건 정수가 나온다.

예를 들어 루트4는 2이듯이 1로 나눈 나머지값이 0이라면 된다!

4. 알게 된 점

 

나의 문제풀이

못풀었다....

 

 

남의 문제풀이

function solution(n) {
    var answer = 0;
    let sqrt = Math.sqrt(n);
    if (sqrt % 1 !== 0) { // 나머지를 이용해 소숫점 판별, 제곱근이 아닐 경우
        answer = 2;
    } else {
        answer = 1 // 제곱근일 경우, 나머지가 오직 0
    }
    return answer
}

 

루트 또는 제곱근을 씌우고,

1로 나머지를 구할때 0인지 아닌지로 판별!

728x90

1. 문제점

프로그래머스 알고리즘 문제풀이 - 자바스크립트 [자릿수 더하기]

2. 시도해본 것들

일반 숫자를 문자열로 만들고, 배열로 만들고, 다시 숫자로 바꿔야하나.....

깔끔하지 않아보이지만 내가 할 수 있는 유일한 방법이란 생각도 들었고

다시 개념정리 하기 위해 사용해보았다.

3. 해결과정

n은 임의의 숫자

//  숫자를 문자열로 변경
    const str = String(n);  
//  문자열을 배열로 변경
    const newArr = Array.from(str)

// 배열값을 숫자로 변경

    answer += Number(newArr[i])

4. 알게 된 점

 

나의 문제풀이

function solution(n) {
    var answer = 0;
//  숫자를 문자열로 변경
    const str = String(n);  
//  문자열을 배열로 변경
    const newArr = Array.from(str)
    
    for (i=0; i<newArr.length; i++){
// 배열을 숫자로 변경
        answer += Number(newArr[i])
    }
    return answer

}

타입변경하며 폭풍 노가다..!

 

남의 문제풀이

function solution(n) {
  return n
    .toString() //숫자의 문자화
    .split("") // 배열화 ["1","2","3","4"]
    .reduce((sum, str_num) => sum + Number(str_num), 0);
    
    //reduce함수는 누적시켜가는 내장함수로 생각하자
	//sum에 합계로 받을 시작점 0을 넣어준다.
    //str_num은 누적시켜갈 숫자를 더해야하는데 문자열 "1" 상태니 숫자화 시킨다
    //0에서 시작하여 배열의 내용을 모두 숫자화해서 더하면 끝
}

 

reduce가 뭔지 몰라서 검색 했을 때 다음과 같은 예시가 나왔다.

 

const arr1 = [ 1, 2, 3, 4, 5 ];
arr1.reduce((a, b) => a + b); // 15

 

그런데 마지막에 0은 없어서 팀원에게 질문했더니 acc의 시작값이라고 했다.

첫번째 인자는 일종의 let sum = 0 과 같은 거고,

reduce는 누적시켜주는 함수라고 생각하면 된다고 했다.

 

현재 문자열을 배열화한 상태로 ["1", "2", "3"[

이런식으로 들어가 있기 때문에 합계부분은 acc는 0 (숫자)

그 뒤 cur에는 "1" , "2" 가 들어가기에 Number로 숫자화해서 더해주면 된다. 

728x90

+ Recent posts