Coderbyte(JavaScript) - Questions Marks

미정·2021년 8월 20일
0

Coderbyte | JavsScript

목록 보기
4/4

✅문제

Have the function QuestionsMarks(str) take the str string parameter, which will contain single digit numbers, letters, and question marks, and check if there are exactly 3 question marks between every pair of two numbers that add up to 10. If so, then your program should return the string true, otherwise it should return the string false. If there aren't any two numbers that add up to 10 in the string, then your program should return false as well.

For example: if str is "arrb6???4xxbl5???eee5" then your program should return true because there are exactly 3 question marks between 6 and 4, and 3 question marks between 5 and 5 at the end of the string.

🎹📢입출력 예제

✍풀어보기

function QuestionsMarks(str) { 
  const lengArr = str.split(/[0-9]/);
  const numArr = [];
  let numIndex = -1;
  lengArr.map((element)=>{
      numIndex += element.length + 1;

      if(str[numIndex]){
        numArr.push(+str[numIndex]);
      }

    return;
  })
  
  let sum = 0;
  for(let i = 0; i < numArr.length; ++i){
    sum += numArr[i];

    if(sum == 10){
      return true;
    }
    if(i % 2 === 1){
      sum = 0;
    }
  }

  return false; 
}
   
QuestionsMarks(readline());

생각보다 문제가 어려웠다. for문 두개를 이용해서 풀게되면 너무 지저분할 것 같아서 다른 방법을 찾다가 split() 함수에 정규표현식으로 숫자를 구분자로 나눈 배열을 만들고, 이 배열들이 나눠졌기 때문에 숫자에 해당하는 인덱스를 찾을 수 있었다.

숫자들을 다시 배열로 구성하고 탐색하면서 왼쪽 숫자와 오른쪽 숫자가 더해서 10이 되는지 판별하는 로직을 작성했다. 인덱스가 홀수라면 오른쪽 숫자이므로 다음 요소로 넘어가기 전에 sum 값을 0으로 초기화 했다.

근데 성능 테스트에서 0점.. 정확도에서 4점이 나와서 10점 만점에 4점이 나왔다..

문제를 잘못 이해했었다. 모든 쌍에 대해 숫자가 10이고 숫자와 숫자 사이에 물음표가 3개이상 있어야 한다는 것이었다. 하나라도 조건에 부합하지 않으면 false를 반환해야 했다..
영어를 한국어로 번역해도 물음표가 정확하게 3개 있어야한다고 되어있길래 믿고 풀었는데 ㅠㅠ 영어실력이 정말로 중요한 순간이었다. 직역으로는 정확한 파악이 어려웠다.


🎈다른 사람의 풀이

function QuestionsMarks(str) { 
    res = false;
    for(let i=0; i<str.length; i++){
        for(let j=i+1; j<str.length; j++){
            if(Number(str[i]) + Number(str[j])=== 10){
                res = true;
                if(str.slice(i,j).split("?").length -1 < 3){
                    return false;
                }
            }
        }
    }
    return res;
}
   
QuestionsMarks(readline());

진짜 기본적인 깔끔한 문제 풀이라 마음에 들었다. 우선 왼쪽 숫자와 오른쪽 숫자의 합이 10인 조건에서 slice() 함수를 이용해서 왼쪽 숫자와 오른쪽 숫자 사이의 값을 잘라 배열로 만들고, 물음표 문자를 기준으로 배열로 만든 뒤에 길이가 4보다 작으면 false를 리턴한다. 예를 들어 "asdf?ddd".split('?') 같은 경우 [asdf, ddd] 로 반환된다. 구분자가 3개라는건 배열의 길이가 4가 되어야 한다는 말이다.


다시 풀어보기

function QuestionsMarks(str) { 
  const lengArr = str.split(/[0-9]/);
  const numArr = [];
  let numIndex = -1;
  lengArr.map((element)=>{
      numIndex += element.length + 1;
      if(str[numIndex]){
        numArr.push(+str[numIndex]);
      }
  })

  let sum = 0;
  let result = false;
  for(let i = 0; i < numArr.length - 1; ++i){
    sum = numArr[i] + numArr[i+1];
    if(sum === 10){
      result = true;
      if(lengArr[i+1]?.split('?').length < 4){
        return false;
      }
    }
  }
  
  return result; 
}
   
QuestionsMarks(readline());

다른사람의 풀이를 보고 완전히 이해시키기 위해 내가 푼 방법에서 수정했다. 왼쪽 숫자와 오른쪽 숫자를 더해주는 방식으로 바꿧다. 그 전에는 왼쪽 숫자 오른쪽 숫자가 한쌍이고 건너 뛰어야 하는 것으로 문제를 이해했던 것 같다.
그리고 lengArr[i+1]?.에서 ?.선택적 연결 연산자라고 하며, 왼쪽 데이터가 null이나 undefine 이라면 뒤에 문장을 실행하지 않고 undefine을 반환해준다.



참고 자료 및 사이트 (감사합니다)

profile
공사중

0개의 댓글