본문 바로가기
코테연습

137. 이것이 코딩 테스트다 : 12장 문자열 재정렬 Javascript

by hxunz 2022. 9. 15.

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 모든 알파벳을 오름차순으로 정렬하여 이어서 출력한 뒤에 그 뒤에 모든 숫자를 더한 값을 출력한다.
  • 주어진 자료는 무엇인가?
    - 알파벳 대문자와 숫자(0~9)로만 구성된 문자열

2. 계획

  1. 주어진 문자열을 쪼개서 배열로 만든다.
  2. 배열을 순회하면서 문자열과 숫자를 나눈다.
  3. 문자열을 오른차순으로 정렬한다.
  4. 숫자를 더한다
  5. 이 둘의 값을 이어서 출력한다.

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (S) => {
  // 주어진 문자열을 쪼개서 배열로 만든다. 
  const s = S.split('');

  // 배열을 순회하면서 문자열과 숫자를 나눈다.
  let str = [];
  let num = [];
  s.map((it) => {
    if (isNaN(it)) {
      return str.push(it)
    } else {
      return num.push(it)
    }
  })

  // 문자열을 오른차순으로 정렬한다.
  const sortStr = str.sort().join('');

  // 숫자를 더한다
  const sumNumber = num.map((it) => Number(it)).reduce((acc, cur) => acc + cur)
  // 이 둘의 값을 이어서 출력한다.
  return sortStr + sumNumber
}

test('sortString', () => {
  expect(solution('K1KA5CB7')).toEqual('ABCKK13');
  expect(solution('AJKDLSI412K4JSJ9D')).toEqual('ADDIJJJKKLSS20')
})

4. 반성

  • 문자열도 배열처럼 인덱스를 사용할 수 있다는게 생각이 났다. 그래서 주어진 문자열을 쪼개지 않고 바로 for반복문을 사용할 수 있을 것 같다.
const solution = (S) => {
  // 배열을 순회하면서 문자열과 숫자를 나눈다.
  let str = [];
  let num = [];
  for (i = 0; i < S.length; i++) {
    if (isNaN(S[i])) {
      str.push(S[i])
    } else {
      num.push(S[i])
    }
  }

  // 문자열을 오른차순으로 정렬한다.
  const sortStr = str.sort().join('');

  // 숫자를 더한다
  const sumNumber = num.map((it) => Number(it)).reduce((acc, cur) => acc + cur)
  // 이 둘의 값을 이어서 출력한다.
  return sortStr + sumNumber
}
  • 숫자인지 문자열인지 판별하는 방법도 typeof를 사용해서 해결할 수도 있을 것 같다.

댓글