가쟤의 해변일기 🐳

프로그래머스 JS 코테 | 문자열 정수의 합, 이상한 문자 만들기 본문

코딩 테스트 in JS

프로그래머스 JS 코테 | 문자열 정수의 합, 이상한 문자 만들기

바닷가쟤 2023. 9. 4. 14:12

이번엔 그룹 코테 스터디에서 풀어오기로 한 문제다.

0단계 문제는 수월하게 풀었지만.. 1단계 문제를 정말 오래..^^ 붙잡고 있었다....

 


Lv.0 [그룹 스터디] 문자열 정수의 합

문자열 정수의 합

https://school.programmers.co.kr/learn/courses/30/lessons/181849?language=javascript

 

일단 reduce 메서드로 더하는게 생각이 났다.

이제 문자열로 주어진 num_str을 split해서 숫자열로 바꾸고 reduce를 해줘야 할 것 같다.

function solution(num) {
    return num.split("")
}

.split() 메서드를 문자열에 쓰면 배열 안에 각 문자열이 들어간다.

→ 이제 숫자로 바꿔주자.

 

parseInt(num).split("")

이건 안되더라ㅏ.. 숫자라서..

num.split("").map(Number) 이렇게 하면 숫자로 이뤄진 배열로 만들 수 있다.

 

성공 !

function solution(num) {
    return num.split("").map(Number).reduce((a,b) => a + b, 0)
}

 

다른 사람 풀이

num_str.split("").map((a)=>answer+=Number(a))

reduce를 안 쓰고서 map에서도 더할 수 있듬…

function solution(num_str) {
    return [...num_str].reduce((a, c) => a + +c, 0)
}

무친…ㅋ…+로 문자를 숫자로 바꿨다….전개 연산자를 사용하다니..

 


Lv.1 [그룹 스터디] 이상한 문자 만들기

이상한 문자 만들기

문자열이니까 길이를 구해서 2로 나눈 나머지가 0이면 짝수, 아니면 홀수로 구하고 if문 혹은 삼항 연산자로 구해보려고 한다.

아니.. 그걸 구하는게 아니고 s의 인덱스 번호가 짝수/홀수면 ? 으로 해야한다.

s[i] 일 경우 i % 2 === 0 이거로 if문 돌리기

s의 인덱스 번호는 for문으로 돌려야 해서 for문 안에 if문이 있을 것 같다.

다른 메서드 활용은 당장 생각나지 않으니 일단 for문으로 구현해보고 다른 메서드를 생각해봐야겠다.

 

근데 대문자로 만드는게 있었나…?

npm 패키지에_ lodash로 했었던 것 같은데..

쳐보니까 toUpperCase() 메서드가 있다고 한다.

function solution(s) {
    
    for (let i = 0; i <= s.length; i++) {
        if(i % 2 === 0) {
            // 문자열에 push
        } else {
            // 대문자로 변환 후 push
        }
    }
    return //push한 변수 문자열로 변환
}

일단 이런 로직

function solution(s) {
    arr = []
    for (let i = 0; i <= s.length; i++) {
        if(i % 2 === 0) {
            arr.push(s[i].toUpperCase())
        } else {
            arr.push(s[i])
        }
    }
    return arr.join("")
}

이렇게 테스트 케이스는 통과했으나…

제한 사항에 보면 문자열 전체의 짝/홀수 인덱스가 아닌 공백을 기준으로 단어별로 인덱스를 판단 해야 한다고 한다.

테스트 케이스는 단어가 다 홀수여서 통과를 했지만 내 코드를 수정해보자.

 

매개변수로 주어지는 s를 공백을 기준으로 split해서 .. 돌릴까… 하는데…

words = s.split(" ")

이렇게 만…들어줬긴 한데 이걸 배열에 넣어서 … 돌릴까?함.

i를 활용할 수 있을 것 같음..!

function solution(s) {
    words = s.split(" ")
    arr = []
    for (let i = 0; i <= s.length; i++) {
        if(i % 2 === 0) {
            arr.push(words[i][i].toUpperCase())
        } else {
            arr.push(words[i][i])
        }
    }
    return arr
}

네,, 아쉽게도 날로 먹기 실패

에러가 납니다…^^

이중 for문 쓰기 싫은데……………..

어차피 다 순회해야하니까 map을 써보죠 (아니 쓸 수 있긴 한데…

 

아 … 내 실수 알아냄.

if문 조건을 i % 2 === 0 으로 잡아벌임..!! 그래서…ㅋㅋ..

반복문 두 번 쓰는게 맞나봄……………..일단 다 뜯어 고쳐보자..

function solution(s) {
    words = s.split(" ")
    arr = []
    for (let i = 0; i < words.length; i++) {   
        let word = words[i]
        for(let j = 0; j < word.length; j++) {
            if(j % 2 === 0) {
                arr.push(word[j].toUpperCase())
            } else {
                arr.push(word[j])
            }
        }
    }
    return arr
}

대충 for문 두 번 돌리는데 성공했고, if문으로 j가 짝수/홀수인지 확인해서 조건 달았다.

이제 단어별로 띄어쓰기 중간에 추가해주면 된다……

문제 되게 간단해보이는데 구현 왤케 어렵냐..???

if(j + 1 === word.length) arr.push(" ")

와… 미쳣다 ^^

근데 마지막에도 들어가서 마지막 word면 push하지 않게 &&로 해야겠다.

해보려고 열심히 고민했는데 그냥 쉽게 pop()하면 될 듯??

function solution(s) {
    words = s.split(" ")
    arr = []
    for (let i = 0; i < words.length; i++) {   
        let word = words[i]
        for(let j = 0; j < word.length; j++) {
            if(j % 2 === 0) {
                arr.push(word[j].toUpperCase())
            } else {
                arr.push(word[j])
            }
            if(j + 1 === word.length) arr.push(" ")
        }
    }
    arr.pop()
    return arr.join("")
}

않이 웨?????????????? 웨않되..?/??

하 ㅋㅋㅋ하ㅣ

하헣ㅎㅋㅋ

테스트 케이스는 통과했는데…. 나빠….

일단 내가 직접 테스트 케이스를 추가해야 할 것 같다.

???

머가 문젠데요

 

발악

function solution(s) {
    words = s.split(" ")
    arr = []
    for (let i = 0; i < words.length; i++) {   
        let word = []  
        word.push(words[i])
        word.map((w, index) => {
            (w[index] % 2 === 0) 
                ? arr.push(word[index].toUpperCase()) 
                : arr.push(word[index])
            if (index + 1 === word.length) arr.push(" ")
        })
    }
    arr.pop()
    return arr.join("")
}

뭔가를 시도했지만 개같이 실패

 

최종 성공

다시 원점으로 돌아옴.

function solution(s) {
    words = s.split(" ")
    answer = []
    for (let i = 0; i < words.length; i++) {   
        for(let j = 0; j < words[i].length; j++) {
            if(j % 2 === 0) {
                answer += words[i][j].toUpperCase()
            } else {
                answer += words[i][j].toLowerCase()
            }
        }
        if(i + 1 < words.length) answer += " "
    }
    return answer
}

이…. toLowerCase가 중요했나보다…. 잠만요…

그리고 띄어쓰기도 문제가 있었나보다….

728x90