반응형

수박수박수박수박수박수?

 

문제 설명

길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

제한 조건
  • n은 길이 10,000이하인 자연수입니다.
입출력 예nreturn
3 "수박수"
4 "수박수박"

 

function solution(n) {
    var answer = '';
    
    for (let i = 0; i < n; i++) {
        if (i % 2 === 0) answer += "수";
        else if (i % 2 === 1) answer += "박";
    }
    
    return answer;
}

console.log(solution(3)); // "수박수"
console.log(solution(4)); // "수박수박"

나머지값이 0이면 수, 1이면 박을 넣어서 문제를 풀어주었습니다.

 

다른사람의 풀이

// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
function waterMelon(n){
  var result = "수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박"
  //함수를 완성하세요

  return result.substring(0,n);
}

// 실행을 위한 테스트코드입니다.
console.log("n이 3인 경우: "+ waterMelon(3))
console.log("n이 4인 경우: "+ waterMelon(4))

문제가 개편된 이후에 돌아갈지 모르겠지만 재미있어서 보여서 가져왔습니다.

( 코딩을 즐기시는 분인듯합니다 ㅎㅎ )

 

또 다른사람의 풀이

// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
const waterMelon = n => "수박".repeat(n).slice(0,n);

console.log("n이 3인 경우: "+ waterMelon(3))
console.log("n이 4인 경우: "+ waterMelon(4))

이 풀이도 개편 이후 돌아가는지는 모르겠지만 깔끔해서 가져왔습니다.

repeat() 메서드와 slice() 메서드를 이용한 깔끔한 풀이였던 것 같습니다.

반응형
반응형

서울에서 김서방 찾기

 

문제 설명

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

제한 사항
  • seoul은 길이 1 이상, 1000 이하인 배열입니다.
  • seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
  • "Kim"은 반드시 seoul 안에 포함되어 있습니다.
입출력 예seoulreturn
["Jane", "Kim"] "김서방은 1에 있다"

 

function solution(seoul) {
    var answer = '';
    
    for (let i = 0; i < seoul.length; i++) {
        if (seoul[i] === "Kim") answer = `김서방은 ${i}에 있다`;
    }
    return answer;
}

console.log(solution(["Jane", "Kim"])); // 김서방은 1에 있다

 

다른사람의 풀이

function solution(seoul) {
    return "김서방은 " + seoul.indexOf('Kim') + "에 있다";
}

indexOf() 메서드를 이렇게 쓸 수 있다는걸 완전 깜빡하고 있었네요.!!

( 찾는 요소가 있으면 그 요소의 첫 번째 인덱스를 반환하고 없으면 -1을 반환했었는데.. )

반응형
반응형

문자열 다루기 기본

 

문제 설명

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

제한 사항
  • s는 길이 1 이상, 길이 8 이하인 문자열입니다.
  • s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.
입출력 예sreturn
"a234" false
"1234" true
문제가 잘 안풀린다면😢

힌트가 필요한가요? [코딩테스트 연습 힌트 모음집]으로 오세요! → 클릭


  • 공지 - 2022년 7월 22일 테스트케이스가 추가되었습니다.
  • 공지 - 2022년 7월 22일 제한 사항이 추가되었습니다.

 

function solution(s) {
    var answer = true;
    const regexp = /[^0-9]/g
    
    if (s.length !== 4 && s.length !== 6) return answer = false;
    else if (s.match(regexp) !== null) return answer = false;
    
    
    
    return answer;
}

console.log(solution("a234")); // false
console.log(solution("1234")); // true

먼저 문자열의 길이가 4와 6인지 확인을 하고 4와 6이외에는 false을 반환해주고 이후에, 정규식을 통해 숫자 이외의 내용이 있으면 또 false을 반환해주었습니다. 

 

다른사람의 풀이

function solution(s) {
    if(s.length != 4 && s.length != 6) return false;
    for(var i = 0; i < s.length; i++) {
        if(isNaN(Number(s[i]))) return false;
    }
    return true;
}

정규식을 몰랐으면 저도 이렇게 풀지 않았을까 싶습니다 ㅎㅎ

 

반응형
반응형

문자열 내림차순으로 배치하기

 

문제 설명
문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

제한 사항
str은 길이 1 이상인 문자열입니다.
입출력 예

s return
"Zbcdefg" "gfedcbZ"

 

실수했던 풀이내용

function solution(s) {
    answer = '';
    answer = s.split("").sort((a, b) => a - b).reverse().join("");

    return answer;
}

console.log(solution("Zbcdefg")); // gfedcbZ

처음 비교할때 실수했던 내용..

sort() 메서드는 기본 정렬로 문자열의 유니코드 포인트를 따르게 됩니다.

그런데.. 습관적으로 a, b를 넣어 숫자비교를 하는 방식을 집어넣어 버리는 바람에 모두 틀렸다고 나와버렸습니다..

( 하필 실행결과는 계속 맞다고 나오는 바람에.. )

 

덕분에 왜 틀린거지? 하고서는 아래까지 갔다 왔습니다.. ㅎㅎ

function solution(s) {
    var answer = '';
    let arr = s.split("");
    let arr1 = [];
    let arr2 = [];
    
    for (let i = 0; i < arr.length; i++) {
        if (arr[i].match(new RegExp(/^[A-Z]/)) === null) arr1.push(arr[i])
        else arr2.push(arr[i])
    }
    
    arr1 = arr1.sort().reverse().join("");
    arr2 = arr2.sort().reverse().join("");
    
    answer = arr1 + arr2
    
    return answer;
}

console.log(solution("Zbcdefg")); // gfedcbZ

여기서도 처음에 sort() 메서드에 a, b 비교를 했다가 계속 틀리는 바람에 정신 차리는데 조금 시간이 걸렸습니다.

덕분에 이젠 실수하지 않겠네요. ㅠㅠ

 

최종 풀이

function solution(s) {
    var answer = '';
    answer = s.split("").sort().reverse().join("");
    return answer;
}

console.log(solution("Zbcdefg")); // gfedcbZ

 

다른사람의 풀이

function solution(s) {
  return s
    .split("")
    .sort()
    .reverse()
    .join("");
}

저랑 같은 방식인데 가장 위에 있길래 신기해서..

 

또 다른 풀이

function solution(s) {
    return s.split("").sort((a,b) => a<b ? 1:-1).join("")
}

위 풀이보다 좋다는 내용과 간결하지만 가독성 때문에 잘 안 쓰인다고 이야기 나오던 코드입니다.

( 개인적으로 둘다 좋아 보입니다 ㅎㅎ 여러 명이서 공유하는 코드라면 위쪽이 좀 더 나을 수는 있을듯합니다.! )

반응형
반응형

문자열 내 p와 y의 개수

 

문제 설명
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.

예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.

제한사항
문자열 s의 길이 : 50 이하의 자연수
문자열 s는 알파벳으로만 이루어져 있습니다.
입출력 예

s answer
"pPoooyY" true
"Pyy" false


입출력 예 설명
입출력 예 #1
'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다.

입출력 예 #2
'p'의 개수 1개, 'y'의 개수 2개로 다르므로 false를 return 합니다.

※ 공지 - 2021년 8월 23일 테스트케이스가 추가되었습니다.

 

function solution(s){
    var answer = true;
    
    let pp = s.toLowerCase().split("").filter(item => item === "p");
    let yy = s.toLowerCase().split("").filter(item => item === "y");
    
    if (pp.length !== yy.length) answer = false;
    
    return answer;
}

console.log(solution("pPoooyY")); // true
console.log(solution("Pyy")); // false

split() 메서드로 배열로 만든 이후, 필터로 p와 y를 새로운 배열로 반환시킨다음 수를 비교했습니다.

:: 대소문자를 구별하지 않는다고 하였기에, toLowerCase() 메서드로 모두 소문자로 변경해 줬습니다.

// length가 붙을 수 있었군요..
console.log(s.toLowerCase().split("").filter(item => item === "p").length); // 2

 

다른사람의 풀이

function numPY(s){
  //함수를 완성하세요
    return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}


// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log( numPY("pPoooyY") )
console.log( numPY("Pyy") )

여러 풀이 중에 제일 깔끔해 보였습니다.

제가 만든 풀이에 상위버전 느낌이 들었습니다.. 헉

 

반응형
반응형

문자열 내 마음대로 정렬하기

 

문제 설명
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

제한 조건
strings는 길이 1 이상, 50이하인 배열입니다.
strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
모든 strings의 원소의 길이는 n보다 큽니다.
인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
입출력 예

 

strings n return
["sun", "bed", "car"] 1 ["car", "bed", "sun"]
["abce", "abcd", "cdx"] 2 ["abcd", "abce", "cdx"]

 
입출력 예 설명
입출력 예 1
"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.

입출력 예 2
"abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x"입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다.

 

function solution(strings, n) {
    var answer = [];
    
    answer = strings.sort((a, b) => a[n] === b[n] ? (a > b ? 1 : -1) : (a[n] > b[n] ? 1 : -1))

    return answer;
}

console.log(solution(["sun", "bed", "car"], 1)); // ["car", "bed", "sun"]
console.log(solution(["abce", "abcd", "cdx"], 2)); // ["abcd", "abce", "cdx"]

삼항연산자를 사용하는데 습관적으로 중괄호( {} )를 사용해서 자꾸 오류가 나는 바람에 시간이 조금 걸렸습니다.

 

다른사람의 풀이

function solution(strings, n) {
    // strings 배열
    // n 번째 문자열 비교
    return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}

비슷한 풀이..!

 

재미있던 풀이

function solution(strings, n) {
    return strings.sort((a, b) => {
        const chr1 = a.charAt(n);
        const chr2 = b.charAt(n);

        if (chr1 == chr2) {
            return (a > b) - (a < b);
        } else {
            return (chr1 > chr2) - (chr1 < chr2);
        }
    })
}

풀이내용 설명해주신것을 가져와봤습니다..!

sort함수 안에 들어가는 compareFunction은 함수에게 배열의 2개의 요소를 받습니다(보통 a,b라고 많이 지정하죠). 이 2개를 반복해서 보낸뒤 compatreFuntion이 반환하는 값을 기준으로 정렬합니다. 반환값>0이면 a가 b보다 앞에 있어야하고, 반환값=0이면 a와 b의 순서를 바꾸지 않는다. 반환값<0이면 b가 a보다 앞으로 순서를 바꾼다. 이런식으로요. 그런데 윗분들이 말씀하셨듯 자바스크립트에서 true=1, false=0입니다. 즉, (a > b) - (a < b); 이 식은 a가 b보다 크면 b가 a보다 앞에 있어야한다(리턴값 = 1) 또는, b가 a보다 크면 a는 b보다 앞으로 와야한다(리턴값 = -1)라는 식으로 해석될 수 있고, 이건 compareFuntion을 아무것도 쓰지 않은 기본적인 sort()와 똑같이 동작합니다.

 

반응형
반응형

두 정수 사이의 합

 

문제 설명
두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

제한 조건
a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
a와 b의 대소관계는 정해져있지 않습니다.
입출력 예

a b return
3 5 12
3 3 3
5 3 12

 

function solution(a, b) {
    var answer = 0;
    let arr = [a, b].sort((a, b) => a - b);
    let count = 0;
    
    if (a === b) return answer = a;
    
    for (let i = arr[0]; i <= arr[1]; i++) {
        answer += arr[0] + count;
        
        count++;
    }
    
    return answer;
}

console.log(solution(3, 5)); // 12
console.log(solution(3, 3)); // 3
console.log(solution(5, 3)); // 12

먼저 대소관계가 정해져있지 않다고하여 배열로 만든 후, 오름차순으로 배열을 생성해줬습니다.

다음으로 a와 b가 같을 때는 아무 수나 반환 가능하다하여 a를 반환해주고, for을 활용해 arr[0]에서 시작해서 arr[1]까지 반복해줍니다.

현재 i는 arr[0]으로 시작을 하기 때문에, 0번부터 시작할 수 있는 count 변수를 하나 만들어줬습니다.

 

다른사람의 풀이

function solution(a, b) {
    return [...Array(Math.abs(a-b)+1)].reduce((s,_,i) => s+i+Math.min(a,b), 0);
}

생각으로는 [...Array(Math.abs(a-b) + 1] 표현식으로 절대값의 길이가 같은 새 배열을 생성해줍니다.

3과 5의 절대 값인 2에 1을 더해서 배열 길이가 3인 배열을 생성해줍니다.

그다음 reduce를 배열에 적용해서 최종값을 반환한다고 생각됩니다.

 

하나씩 풀어보니, [...Array(Math.abs(a-b) + 1]까지 풀어보면 배열에 'undefined'가 3개 들어가게 됩니다. reduce로 반환된 내용들을 살펴봤는데도 s는 undefined, _도 undefined, i는 인덱스, Math.min은 3이 들어오게 되었습니다.

풀어서 보니 뭔가 더 헷갈리는 느낌을 받았습니다.. ( 나중에 다시 확인하기로 .. !! )

 

  • Math.abs()함수: 주어진 숫자의 절대값을 반환합니다.
  • Math.min()함수: 주어진 숫자들 중 가장 작은 값을 반환합니다.
  • reduce()메서드: 배열의 각 요소에 대해 주어진 리듀서함수를 실행하고, 하나의 결과값을 반환합니다.
반응형
반응형

나누어 떨어지는 숫자 배열

 

문제 설명
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

제한사항
arr은 자연수를 담은 배열입니다.
정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
divisor는 자연수입니다.
array는 길이 1 이상인 배열입니다.
입출력 예

arr  divisor  return
[5, 9, 7, 10] 5 [5, 10]
[2, 36, 1, 3] 1 [1, 2, 3, 36]
[3,2,6] 10 [-1]


입출력 예 설명
입출력 예#1
arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.

입출력 예#2
arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.

입출력 예#3
3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.

 

function solution(arr, divisor) {
    var answer = [];
    
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] % divisor === 0) answer.push(arr[i])
    }
    
    answer.sort((a, b) => a - b)
    if (answer.length === 0) answer.push(-1)
    return answer;
}

console.log(solution([5, 9, 7, 10], 5)); // [5, 10]
console.log(solution([2, 36, 1, 3], 1)); // [1, 2, 3, 36]
console.log(solution([3,2,6], 10)); // [-1]

먼저 나누어 떨어지는 숫자를 answer안에 넣어줍니다.

입출력 예2번에 원소를 오름차순으로 정렬하라는 내용이 있기에 sort()를 활용하여 순서대로 넣어주었습니다.

그리고 만약에 원소에 없는 경우에는 -1을 넣어주었습니다.

 

다른사람의 풀이

function solution(arr, divisor) {
    var answer = arr.filter(v => v%divisor == 0);
    return answer.length == 0 ? [-1] : answer.sort((a,b) => a-b);
}

필터를 활용하여 새로운 answer배열로 반환한다음, 3항연산자로 있는경우와 없는 경우를 다룬 내용인듯합니다. 깔끔하네요.

 

반응형
반응형

같은 숫자는 싫어

 

문제 설명
배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

제한사항
배열 arr의 크기 : 1,000,000 이하의 자연수
배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수


입출력 예

arr answer
[1,1,3,3,0,1,1] [1,3,0,1]
[4,4,4,3,3] [4,3]


입출력 예 설명
입출력 예 #1,2
문제의 예시와 같습니다.

 

function solution(arr) {
    var answer = [];
    
    // 효율성테스트에서 계속 실패했던 부분
    if (answer.length === 0) answer.push(arr[0]);

    for (let i = 0; i < arr.length; i++) {
        if (answer.at(-1) !== arr[i]) answer.push(arr[i]);
    }

    // for (const ele of arr) {
    //     if (answer.at(-1) !== ele) answer.push(ele);
    // }


    // arr.forEach(ele => {
    //     if (answer.at(-1) !== ele) answer.push(ele);
    // })


    return answer;
}

console.log(solution([1,1,3,3,0,1,1])); // [1,3,0,1]
console.log(solution([4,4,4,3,3])); // [4,3]

처음에 아무것도 없을 때 첫번째 요소를 넣어주지 않아서 효율성테스트에서 계속 실패했었습니다..

이후 for .. of, forEach를 사용해봤는데도 효율성테스트를 통과하지 못해서 혹시나해서 if문을 넣어봤는데 성공했습니다.

( for .. of와 forEach는 if문을 추가해줬는데도 계속 실패하더군요.. 끄으으윽.. )

filter로도 뭔가 될 것 같았는데 실패해서 포기했습니다. ( 그런데.. )

 

다른사람의 풀이

function solution(arr)
{
    return arr.filter((val,index) => val != arr[index+1]);
}

위처럼 filter를 활용해서 푸시는 분들도 있었네요.

filter를 사용하면 항상 첫번째 매개변수만 사용했었기 때문에 두번째 index가 들어온다는것을 완전 잊고 있었습니다..

 

반응형
반응형

가운데 글자 가져오기

 

문제 설명
단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

재한사항
s는 길이가 1 이상, 100이하인 스트링입니다.

 

입출력 예

s return
"abcde" "c"
"qwer" "we"

 

function solution(s) {
    var answer = '';
    let arr = s.split("");

    if (s.length % 2 === 1) answer = arr[Math.ceil(s.length / 2) - 1]
    else answer = arr[Math.ceil(s.length / 2) - 1] + arr[Math.ceil(s.length / 2)]

    return answer;
}

console.log(solution("abcde")); // c
console.log(solution("qwer")); // we

먼저 문자열이 홀수인지 짝수인지 (s.length % 2)로 확인을 해주었습니다.

이후 가운데 글자를 찾기위해,  s.length를 반으로 나누어줍니다.

Math.ceil()함수로 소수일 경우 올림을 해줍니다.

배열은 0번부터 시작이기 때문에 -1을 해줍니다.

짝수인 경우 가운데 두글자를 반환해줍니다.

 

다른사람의 풀이

function solution(s) {
    return s.substring(Math.ceil(s.length/2)-1, Math.floor(s.length/2)+1)
}

 

 

  • substring() 메서드: string 객체의 시작 인덱스로 부터 종료 인덱스 전까지 문자열의 부분 문자열을 반환합니다.
  • Math.floor() 함수: 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환합니다. ( 내림 )
  • Math.ceil() 함수: 주어진 숫자보다 크거나 같은 숫자 중 가장 작은 숫자를 integer로 반환합니다. ( 올림 )
반응형

+ Recent posts