Lsiron

코딩테스트 10(map, join) 본문

코딩테스트/Java Script

코딩테스트 10(map, join)

Lsiron 2024. 7. 1. 20:02

문제 1. 크기가 작은 부분 문자열
 

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.

 
풀이=해답.

function solution(s) {
    let ws = s.split(' ');
    let rWs = ws.map(w => {
        let rW = '';
        for (let i = 0; i < w.length; i++) {
            if (i % 2 === 0) {
                rW += w[i].toUpperCase();
            } else {
                rW += w[i].toLowerCase();
            }
        }
        return rW;
    });
    return rWs.join(' ');
}

 
=> 일단 단어를 공백 기준으로 split() 메서드를 사용하여 나눠준다. 그러면 단어로만 이루어진 배열이 완성된다.

다음으로 이 배열을 map 함수로 순회시켜준다. 단, 대문자와 소문자로 변환하는 반복문을 map 함수 안에 넣어주는데 반복문을 사용하기에 앞서 각 단어를 문자열로 넣어줘야하기 때문에 초기화 시킨 빈 문자열을 선언한다.

(애초에 반복문을 실행시켜서 결과값을 받으려면 무조건 선언해야한다. 또한 toUpperCase()와 toLowerCase()는 안에있는 문자열을 바꿔주는게 아니라 바꾼 문자열을 반환한다.)

반복문은 처리가 완료된 단어를 반환하도록 한다. 그러면 map() 함수를 거쳐 빈 배열에 변환된 단어들이 하나씩 추가 된다.

마지막으로 이 변환된 단어들의 배열을 공백을 넣어서 문자열로 만들어준다. 

 

// 이게 왜 14점..? 그냥 공백 기준으로 단어사이를 나누고 map함수로 단어를 순회하며 대문자와 소문자로 바꿔준 후, 다시 공백을 넣어서 배열을 문자열로 바꿔줬을 뿐인데 굉장히 잘 풀었나보다.. 실력이 늘어난건지 운이 좋은건지..

 

문제 2. 삼총사
 

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

[-3, -2, -1, 0, 1, 2, 3]
학생들의 정수 번호 쌍 (-3, 0, 3), (-2, 0, 2), (-1, 0, 1), (-2, -1, 3), (-3, 1, 2) 이 삼총사가 될 수 있으므로, 5를 return 합니다.

 
풀이=해답.

function solution(numbers) {
    let count = 0;

    for (let i = 0; i < numbers.length - 2; i += 1) {
        for (let j = i + 1; j < numbers.length - 1; j += 1) {
            for (let k = j + 1; k < numbers.length; k += 1) {
                if (numbers[i] + numbers[j] + numbers[k] === 0) {
                    count++;
                }
            }
        }
    }

    return count;
}

 
=> 삼중 반복문으로 그냥 모든 경우의 수를 순회하도록 하고, 3개 합이 0이 되는 경우엔 미리 초기화 시킨 count에 1씩 더하도록 하였다. 

 

// 문제를 짧게 말하면 그냥 3개 더해서 0이 되는 횟수를 구하라는 의미이기 때문에 반복문을 계속 써주었다. 4개 더해서 0이면 그냥 횟수만 추가하면 되니 어려울 건 없었다.