프로그래머스 #JavaScript - 숫자야구

SSO·2020년 2월 3일
0

프로그래머스 Lv2

목록 보기
18/46
post-custom-banner

문제

https://programmers.co.kr/learn/courses/30/lessons/42841

풀이

  1. 풀이 참고.
function solution(baseball) {
    var answer = 0;
    var candidate = '';
  
    //possible numbers
    for (var i=123; i<=987; i++){
        candidate = i.toString();
      
       if((candidate.charAt(1)==="0")
        ||(candidate.charAt(2)==="0")
        ||(candidate.charAt(0)===candidate.charAt(1))
        ||(candidate.charAt(0)===candidate.charAt(2))
        ||(candidate.charAt(1)===candidate.charAt(2))
      ) {
        continue;
       }
   
  //check strike and ball

  //check strike
    var check = true;
    for(var j=0; j<baseball.length; j++){
        var baseballNumber = String(baseball[j][0]);
        var strike = 0;

         for(var k=0; k<3; k++){
            if(candidate[k] === baseballNumber.charAt(k)){
            strike = strike + 1;
            }
        } 

        if(strike !== baseball[j][1]){
          check = false;
          break;
        }
        // check ball  
        var ball = 0;
        for(var k=0; k<3; k++){
          if(candidate.includes(baseballNumber.charAt(k))){
          // if(candidate.indexOf(baseballNumber.charAt(k)) > 0 ){
              ball = ball + 1;
          }
        }          
         ball = ball - strike;

         if(ball !== baseball[j][2]){
           check = false;
              break;     
          }
    }  
      if(check){
      answer = answer + 1;
    }
  }
      
    return answer;
}

더 생각해보기

  1. 완전탐색 -> 처음에 숫자의 후보를 모두 만들어 놓는 걸 생각하지 못함
  2. check의 역할을 떠올리지 못함 -> candidate에서 조건에 맞지 않는 걸 제거 해야 하니까. break가 중요한 역할인 듯 하다
  3. 원래 내가 하려던 방식은 check가 없는데, 그러면 두번째 for문에서 무수히 반복되는 절차가 answer를 count하는데 모두 섞여버리는 문제 발생.

참고사항

완전탐색

profile
happy
post-custom-banner

0개의 댓글