코딩 테스트 in JS

JS 프로그래머스 코딩테스트 | 수박, 가운데 글자 가져오기, 문자열 다루기 기본

바닷가쟤 2023. 8. 24. 09:58

 

이번엔 패캠 그룹 스터디에서 다같이 풀고 코드리뷰할 코테 문제를 풀었다. 

시간이 없어서 급하게 문제를 푸느라 좀 더 스스로 고민하는 시간이 적어서 조금 아쉽다.

테스트 케이스는 통과했는데 실패가 뜨는 경우가 오늘은 많았었다.

실패가 뜨고 이유를 알아내야 배우는게 많아지긴 하지만 정말 왜 그런지 조금 더 고민을 해봐야 겠다.

이번엔 안 되면 조금 해보다가 검색을 해봤다...


 

Lv.1 수박수박수박수박수박수?

첫 번째 시도

function solution(n) {
    let str = []
    
    for(let i = 1; i <= n; i++) {
        str.push('수박')
    }
    return str.join('')
}

여기서 왜 str.push(”수박”).join(””)이 안 되는 건지 궁금했다.

.join() 메서드의 위치가 잘못됐다. str.push()의 결과물에 전달되지 않아서 배열에 문자열을 추가한 후에 배열 전체를 결합해야한다.

수박을 쫙 출력해서 join메서드로 문자열로 만들고 split으로 n만큼 자르려고 했다.

물론 되긴 하겠지만 수랑 박을 잘라보기로 했다.

두 번째 시도 : 성공

function solution(n) {
    let str = []
    
    for(let i = 1; i <= n; i++) {
        if(i % 2 === 1) {
            str.push("수")
        } else {
            str.push("박")
        }
    }
    return str.join("")
}

배열에다가 push 메서드로 반복문으로 추가하고 join 메서드로 결합만 해줬다.

홀수면 를 추가하고, 짝수면 을 추가했다. n까지 반복한다.

n이 3이면 1, 2, 3

1은 홀수니까 수

2는 짝수니까 박

3은 홀수니까 수

 

이렇게 성공했다.

 

+) repeat() 반복을 사용할 수 있다. ..

“수박”.repeat(n) 이렇게…

그러고 slice 하면 된다. .. ..

const waterMelon = n => "수박".repeat(n).slice(0,n);

쨔잔…


Lv.1 가운데 글자 가져오기

첫 번째 시도

function solution(s) {
    return s.length/2
}

바로 감이 왔당ㅇㅇㅇㅇㅇ

올림 해서 if문으로 짝수랑 홀수 구분해서 하면 될 듯..!

왜 저기에 .cell()이랑 floor()가 안대징..

암튼

(s.length/2) % 2 === 0 // 짝수면

이걸 if문에 쓸거다.

function solution(s) {
    const len = s.length/2
    if (len % 2 === 0) { // 짝수면
        return s.slice(len - 1, len + 1) // 중간에서 앞뒤로 +- 1
    } else {  // 홀수면
        return s.slice(len - 0.5, len + 0.5)
    }
}

이런 지저분한 코드를 짰다.

테스트 코드는 통과했는데

ㅋㅋㅋㅋ 무슨일…

웨않되.?

두 번째 시도

slice 사용하는데 소수점을 사용해서 그런 것 같다.

홀수 부분을 s[Math.floor(len)] 으로 바꿨는데 작동은 되는데 실패 뜨네.. 뭐ㅣ지..

세 번째 시도 : 정답

function solution(s) {
    const len = Math.floor(s.length / 2);
    if (s.length % 2 === 0) { // 짝수면
        return s.slice(len - 1, len + 1) // 중간에서 앞뒤로 +- 1
    } else {  // 홀수면
        return s[len]
    }
}

문제는 if 문이었다. s.length로 바로 홀짝을 알아낼 수 있었는데…^^

하는 동안 Math.floor() 인수로 값을 집어넣어야 한다는 것을 알게 되었다 ㅎ핳..

이렇게 통과 !

문제는 if 문이 undefined가 나왔었는데 난 걍 무시하고 했다…

다른 사람 풀이

function solution(s) {
    const mid = Math.floor(s.length/2);
    return s.length %2 === 1 ? s[mid] : s[mid-1]+s[mid];
}

줄인다면 이렇게 줄일 수 있군..


Lv.1 문자열 다루기 기본

첫 번째 시도

function solution(s) {
    if(parseInt(s) !== null) {
        return true
    } else {
        return false
    }
}

parseInt 로 바꿔서 숫자로 바꿔지면 true, null이면 false를 출력하려고 했다.

return parseInt(s) 하면 null이 나왔는데 둘 다 실행 결괏값이 true가 나왔다.

null이 아닌 것 같다. 숫자가 아니니까 NaN일 것이다.

두 번째 시도

function solution(s) {
    if(!isNaN(parseInt(s))) {
        return true
    } else {
        return false
    }
}

테스트 케이스는 통과했는데 채점 결과는 60점…

세 번째 시도

function solution(s) {
    if(s.length === 4 || s.length === 6) {
        if(isNaN(parseInt(s))) {
            return false
        } else {
            return true
        }
    } else {
        return false
    }
}

s의 길이가 4 혹은 6이라고 한다... if 문을 하나 더 추가했다.

80점이지만 오류가 나서 찾아봤다.

네 번째 시도 : 정답

function solution(s) {
    if(s.length === 4 || s.length === 6) {
        return s.split("").every(i => !isNaN(i))
    } else {
        return false
    }
}

실패한 이유는 JS에서 숫자에 e가 붙으면 지수로 인식해 숫자라고 생각한다는 것이다.

every 메소드를 사용하여 문자열 하나하나 NaN인지 대조했다.

isNaN은 불리언 값을 return 하기 떄문에 if문 한 개를 줄일 수 있다.

728x90