본문 바로가기

알고리즘

프로그래머스 자바스크립트 알고리즘 스터디 [문17~문20]

728x90

문제17번: 문자열 다루기 기본

 

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

  • s는 길이 1 이상, 길이 8 이하인 문자열입니다.

나의 코드)

function solution(s) {
    var answer = '0';
    let strLen=s.length
    if((strLen===4||strLen===6)&&(parseInt(s)==s))
        {answer=true
        }else{
        answer=false
        }
    return answer;
}

나의 풀이)

strLen이라는 변수를 만들어 받은 문자열의 길이를 저장한다. OR을 표현하기 위한 방법은 || 인데, shift+\를 누르면 나온다. 숫자로만 구성되어있는지를 확인하기 위해서 parseInt()를 사용하였다. parseInt()의 구체적 사용방법은 아래와 같다

let a=1234 // a가 정수로 이루어져 있을 때
let b=12.34 //b가 소수로 이루어져 있을 때
let c="1234"//c가 문자열로 이루어져 있을 때
let d="a1234"//d가 문자+숫자로 이루어져 있을 때
console.log(parseInt(a)) //1234
console.log(parseInt(b)) //12
console.log(parseInt(c))  //1234
console.log(parseInt(d)) //Nan

기본적으로 parseInt()는 숫자를 받아 소수점 이하를 떼버리고 정수로 치환하는데 많이 사용된다. 한가지 유의할 포인트는 문자열 "1234"라고 할지라도 그 내용값이 숫자로 이루어져있다면 자바스크립트는 parseInt()안의 문자열로 이루어진 숫자들을 숫자로 반환한다는 것이다. 반면에 문자열안의 내용값들이 문자와 숫자가 섞여있는 경우는 Nan을 반환하게 도된다. parseInt(newStr)===newStr의 조건이 성립한다는 것은 newStr이라는 문자열 내의 모든 값들이 다 숫자로 이루어져있다는 의미이다. And를 표현하기 위해서는 &&를 사용한다.

 

문제18번: 서울에서 김서방 찾기

 

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

  • seoul은 길이 1 이상, 1000 이하인 배열입니다.
  • seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
  • "Kim"은 반드시 seoul 안에 포함되어 있습니다.

나의 코드)

function solution(seoul) {
    var answer = '';
    let location= seoul.indexOf("Kim")
    answer="김서방은 "+location+"에 있다"
    return answer;

}

나의 풀이)

indexOf()의 자세한 사용법은 아래와 같다.

let arr1=["Jane", "Kim","Sehun","Jiyeh"]
let a=arr1.indexOf("Jane")//제인의 인덱스 번호
let b=arr1.indexOf("Kim")//김의 인덱스 번호
let c=arr1.indexOf("Jua")//주아의 인덱스 번호(배열에 없음)
console.log(a)//0
console.log(b)//1
console.log(c)//-1

index()의 경우 배열에서 특정 요소가 어디에 위치하는지를 알려주는 메소드이다. arr1에서 Jane의 위치는 배열의 맨 처음이기 때문에 0이고, Kim은 1이다. 배열에 없는 요소를 넣는 경우에는 -1을 반환한다.

 

문제19번: 수박수박수박수

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

  • n은 길이 10,000이하인 자연수입니다.

나의 코드)

function solution(n) {
    var answer = '';
    let str='수박'
    if(n%2==0){
        answer= str.repeat(n/2)
    }else{
        answer=str.repeat(Math.floor(n/2))+str[0]
    }
    return answer;
}

나의 풀이)

n이 짝수인 경우네는 str='수박'을 n/2번 반복해주고, n이 홀수인 경우에는 (n/2)를 반올림한 값만큼 반복한 뒤 str='수박'의 0번째 값인 '수'를 붙여주면 된다. Math.floor()에 대한 자세한 내용은 아래와 같다.

let a=1234 // 정수인 경우
let b=12.34 //12에 가까운 소수인 경우
let c=12.97 //13에 가까운 소수인 경우
let d="1234" //문자열인 경우
console.log(Math.floor(a))//1234
console.log(Math.floor(b))//12
console.log(Math.floor(c))//12
console.log(Math.floor(d))//1234
console.log(Math.round(b))//12
console.log(Math.round(c))//13

Math.floor()는 입력한 숫자들 중 크거나 같은 정수를 반환하는 메소드로서 '내림'과 유사하다. 반면 Math.round는 소수를 가장 가까운 정수로 반환하는 '반올림'과 유사하다. 기본적으로는 숫자를 받지만, "1234"와 같이 문자열 안의 값이 숫자로만 이루어져있다면 자바스크립트는 이를 숫자로 인식해서 Math.floor()와 Math.round()를 실행한다.

 

 

문제20번: 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

나의 코드)

function solution(participant, completion) {
    var answer = '';
    participant.sort();
    completion.sort();
    for(i=0;i<participant.length;i++){
        if(participant[i]!==completion[i]){
            return participant[i]
        }
    }

}

나의 풀이)

단 한명의 선수만 완주하지 못하였다는 조건이 문제속에 있기 때문에 위와 같은 코드가 가능하다. 참가자와 완료자를 순차적으로 정렬을 맞춘 다음 각 배열의 인덱스번호의 인덱스가 일치하지 않는 순간의 participant[i]가 정답이 된다. 다만 위와 같은 풀이는 '단 한명의 선수만 완주하지 못하였다'는 조건이 없다면 사용할 수 없다.

조금 더 범용성이 좋은 코드로 문제를 풀어보면 어떨까 싶어 아래와 같이 문제 풀이를 시도해보았다

function solution(participant, completion) {
    var answer = [];
    for(i=0;i<participant.length;i++){
        if(completion.includes(participant[i])!=true){
        answer.push(participant[i]) 
        }
    }return answer.join("")
}

완주자가 participant[i]를 포함하지 않는 경우에 해당 participant[i]를 answer에 넣은 뒤 join("")을 통해 배열의 값을 문자로 이어주는 방법이었으나, 세개의 테스트 중 2개만 통과를 할 수 있었다.

테스트 1
입력값 ["leo", "kiki", "eden"], ["eden", "kiki"]
기댓값 "leo"
실행 결과 테스트를 통과하였습니다.
테스트 2
입력값 ["marina", "josipa", "nikola", "vinko", "filipa"], ["josipa", "filipa", "marina", "nikola"]
기댓값 "vinko"
실행 결과 테스트를 통과하였습니다.
테스트 3
입력값 ["mislav", "stanko", "mislav", "ana"], ["stanko", "ana", "mislav"]
기댓값 "mislav"
실행 결과 실행한 결괏값 ""이(가) 기댓값 "mislav"와(과) 다릅니다.

마지막 테스트의 경우 "mislav"라는 사람이 두명 존재하였기 때문에 한 명의 "mislav"는 통과했지만 다른 한명의 "mislav"는 통과하지 못한 상황이었고, completion.includes(participant[i])에서 걸러낼 수가 없었기 때문이다. 

728x90