xo.js (7kyu 12)

Codewars 알고리즘 풀이


Problem

  • Check to see if a string has the same amount of ‘x’s and ‘o’s.
    • 문자열의 ‘x’와 ‘o’가 같은 양인지 확인한다.
  • The method must return a boolean and be case insensitive.
    • 메소드는 boolean을 반환해야 하고, 대소문자를 구분하지 않는다.


Solution 01

function xo(str) {
  let countX = 0;
  let countO = 0;
  
  for (let i = 0; i < str.length; i++) {
    if (str[i] === 'x' || str[i] === 'X') {
      countX++;
    }
    
    if (str[i] === 'o' || str[i] === 'O') {
      countO++;
    }
  }
  return countX === countO;
}

xo('xo');    // true
xo('oo');    // false
xo('xxxo');  // false
xo('xxOo');  // true


Solution 02

function xo(str) {
  str = str.toLowerCase();
  return str.split('x').length === str.split('o').length;
}

xo('xo');    // true
xo('oo');    // false
xo('xxxo');  // false
xo('xxOo');  // true

toLowerCase(): 문자열을 소문자로 변환한다.

split(): 문자열을 부분 문자열로 분할하고, 새 배열로 반환한다.


Solution 03

function xo(str) {
  str = str.toLowerCase().split('');
  return str.filter(i => i === 'x').length === str.filter(i => i === 'o').length;
}

xo('xo');    // true
xo('oo');    // false
xo('xxxo');  // false
xo('xxOo');  // true

filter(): 테스트를 통과한 배열의 각 값을 모아, 새 배열로 반환한다.


Solution 04

function xo(str) {
  let x = str.replace(/x/gi, '');
  let o = str.replace(/o/gi, '');
  
  return x.length === o.length;
}

xo('xo');    // true
xo('oo');    // false
xo('xxxo');  // false
xo('xxOo');  // true

replace(): 대응되는 문자열을 찾아 다른 문자열로 치환한다.

g: 전역 검색

i: 대소문자 구문 없는 검색


Solution 05

function xo(str) {
  let x = str.match(/x/gi);
  let o = str.match(/o/gi);
  
  return (x && x.length) === (o && o.length);
}

xo('xo');    // true
xo('oo');    // false
xo('xxxo');  // false
xo('xxOo');  // true

match(): 문자열에서 정규식과 일치하는 문자를 검색하고, 배열로 반환한다.