본문 바로가기
코테연습

133. 이것이 코딩 테스트다 : 11장 문자열 뒤집기 Javascript

by hxunz 2022. 9. 14.

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 문자열 s에 있는 모든 숫자를 전부 같게 만들 때 해야 하는 행동의 최소 횟수를 구하라
  • 주어진 자료는 무엇인가?
     - s = 0과 1로만 이루어진 문자열
     - 연속된 하나 이상의 숫자를 뒤집을 수 있다.
     - 뒤집기 = 0을 1로 뒤집거나 1을 0으로 뒤집는다

2. 계획

  1. 0이 연속중인 경우와 1이 연속중인 경우 각각 카운트를한다.
  2. 카운트가 더 적은 숫자의 카운트 값을 리턴한다.

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (s) => {
  // 0이 연속중인 경우와 1이 연속중인 경우 각각 카운트를한다.
  let zeroCount = 0;
  let oneCount = 0;
  for (i = 0; i < s.length; i++) {
    if (s[i] === '0' && s[i + 1] !== '0') {
      zeroCount += 1;
    }
    if (s[i] === '1' && s[i + 1] !== '1') {
      oneCount += 1;
    }
  }
  // 카운트가 더 적은 숫자의 카운트 값을 리턴한다.
  return zeroCount > oneCount ? oneCount : zeroCount
}

test('reverse', () => {
  expect(solution('0001100')).toEqual(1);
  expect(solution('1111')).toEqual(0);
  expect(solution('00000001')).toEqual(1);
  expect(solution('11001100110011000001')).toEqual(4);
  expect(solution('11101101')).toEqual(2);
});

4. 반성

  • for문을 사용하지 않고 문자열을 쪼개서 배열에 담은 후 배열의 길이가 더 짧은 값을 리턴해보았다.
const solution = (s) => {
  const zero = s.split('1').filter((it) => it !== '').length;
  const one = s.split('0').filter((it) => it !== '').length;
  return Math.min(zero, one)
}



댓글