[JS 알고리즘 문제] #1 Printer Errors

in #kr6 years ago (edited)


codewars에 나오는 JavaScript 관련 다양한 알고리즘 문제를 하나씩 풀어나가면서 코딩실력을 키워나가보자!

 

[문제] 

어느 공장에 있는 프린터는 1개의 라벨을 프린트할 때마다, 하나의 색상을 사용한다. 

이때, 색상의 이름은 알파벳 a부터 m까지 다양하다. 


또한, 프린터에 의해 사용된 색상은 문자열로 기록이 되는데, 예를 들면, “aaabbbbhaijjjm” 이런식이다. 

이 문자열은 a라는 색상을 3번, b라는 색상을 4번, h라는 색상을 1번, a라는 색상을 1번, i라는 색상을 1번, j라는 색상을 3번, m이라는 색상을 1번 사용했다는 뜻이다. 

그러나, 가끔 프린터가 에러가 나는 경우가 있는데, “aaaxbbbbyyhwawiwjjjwwm” 이렇게 나오는 경우도 있다. 

프린터에 의해 사용된 색상은 a부터 m까지 이기 때문에, 나머지는 에러가 된다.(예를 들어, x, w 등) 


프린터에 의해 사용된 전체 색상 수 대비 에러의 수의 비율을 문자열로 나타내는 프로그램을 작성하라. 

기록되는 문자열은 1개 이상의 a부터 z까지 알파벳으로 문자열만 포함한다. 


 function printerError(s) { 
    // your code 
 } 



[예제] 

var s=“aaabbbbhaijjjm”; 
printerError(s) => "0/14”  


var s=“aaaxbbbbyyhwawiwjjjwwm”; 
printerError(s) => "8/22" 



[알고리즘] 

  • error의 총수와 총 색상수를 구해서, “/"를 더해 문자열로 리턴한다.
  • 총 색상수는 인풋 s의 갯수로 구한다.(s.length)
  • error의 총수를 구하기 위해, 인풋 s의 각 알파벳이 a부터 m사이에 포함되는지 확인하고, 포함이 안되면, error의 수를 1개씩 추가하는 방식으로 error의 총수를 계산한다.


우선 기본적으로 아래와 같이 작성했다. 


[Solution] 

function printerError(s) {
 var error = 0;
 for(var i = 0; i < s.length; i++) {
     var letter = s.charAt(i);
     if(letter === "n" || letter === "o" || letter === "p" || letter === "q" || letter === "r" || letter === "s" || letter === "t" || letter === "u" || letter === "v" || letter === "w" || letter === "x" || letter === "y" || letter === "z") {
         error++;
      } 
    }
 return error + "/" + s.length;
}


위 Solution은 인풋 s의 각 알파벳이 n부터 z에 해당하는 경우, error의 수를 1개씩 추가하기 위해, n부터 z까지 직접 작성했다. 

하지만, 코드를 좀더 간결하게 작성하기 위해 아래와 같은 방법도 있다. 


[Better Solution] 

function printerError(s) {
 var error = 0;
 for(var i = 0; i < s.length; i++) {
     var letter = s.charAt(i);
     if(letter > "m") {
         error++;
        }
    }
 return error + "/" + s.length;
}



위 Solution은 인풋 s의 각 알파벳이 “m” 보다 클 경우, error의 수를 1개씩 추가하는 방식으로 작성했다. 

알고리즘 문제는 문제를 정확히 파악후, 정확한 알고리즘을 정리하여 프로그램을 작성하는 것이 우선이지만,  

그 다음은 좀 더 간결하게 효율적으로 작성하는 것이 중요한 것 같다. 


[알아야할 개념]: 문자열 비교 

숫자를 비교하는 것처럼, 문자열도 비교할 수 있다. 

기본적으로 문자열은 알파벳 순으로 비교하면 된다. 

즉, a가 제일 작고, 점점 커져 z가 가장 크다. 

a < b < c ….. < y < z 

function alphaCheck() {
 if("c" > "a") {
     return true;
    } else {
     return false;
    }
}
console.log(alphaCheck()); // true


<글자수가 다를 경우> 

"one" > "a" 

function alphaCheck() {
 if("one" > "a") {
     return true;
    } else {
     return false;
    }
}
console.log(alphaCheck()); // true


문자의 첫 알파벳끼리 비교해서 크기를 비교한다. 


<첫 알파벳이 같을 경우> 

"hello" < "hi" 

function alphaCheck() {
 if("hello" > "hi") {
     return true;
    } else {
     return false;
    }
}
console.log(alphaCheck()); // false


첫 알파벳이 같으면 두번째 알파벳끼리 비교한다. 


<비교할 알파벳이 없을 경우> 

"hea" > "he" 

function alphaCheck() {
 if("hea" > "he") {
     return true;
    } else {
     return false;
}
console.log(alphaCheck()); // true


앞에 알파벳이 같아, 그 다음 알파벳을 비교할 때, 비교대상이 없으면, 알파벳이 있는 문자열이 크다. 





Sort:  

문자열 비교는 되는 언어가 있고, 안되는 언어가 있습니다.
특정 언어에서만 되도록 코딩 연습을 하는 것은 확장성이나 보편성인 측면에서 볼때 좋은 방법은 아닌 것 같군요...

아, 특정 언어를 공부하면서 문법 등을 공부할때 타 언어와 같이 비교하는 것이 훨씬 나중을 생각했을때 더 좋은 방법인가요? 좋은 말씀 감사합니다!

여유가 있다면 그러는 것이 좋겠네요.
자바스크립트는 처음 배우는 언어로서 적합하진 않습니다.
파이선이나 자바,C 같은 언어가 좀 더 적합하다는 생각이 드네요.
아니면 하스켈~~~