Leetcode Java Reconstruct Original Digits from English

업데이트:

문제

Link

코드

class Solution {

  public String originalDigits(String s) {
    char[] charCount = new char['a' + 26];
    for (char c : s.toCharArray()) {
      charCount[c]++;
    }
    int[] count = new int[10];
    count[0] = charCount['z'];
    count[2] = charCount['w'];
    count[4] = charCount['u'];
    count[6] = charCount['x'];
    count[8] = charCount['g'];
    count[3] = charCount['h'] - count[8];
    count[5] = charCount['f'] - count[4];
    count[7] = charCount['s'] - count[6];
    count[9] = charCount['i'] - count[6] - count[5] - count[8];
    count[1] = charCount['n'] - count[7] - (2 * count[9]);
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10; i++) {
      for (int j = 0; j < count[i]; j++) {
        sb.append(i);
      }
    }
    return sb.toString();
  }

}

결과

Link

설명

  1. 주어진 문자열 s가 주어지면 해당 문자열 기반으로 영문 숫자를 만들 수 있는 숫자들을 오름차순으로 변환하는 문제이다.

  2. 문제 풀이에 필요한 변수를 정의한다.
    • charCount는 문자열 s에 포함된 영문자의 개수를 저장할 변수로, ‘a’의 ASCII 코드 값에 ‘z’까지 넣기 위해 26을 더해서 정의하고 문자열 s를 반복하여 영문자의 개수를 넣어준다.
    • count는 생성 가능한 0부터 9까지의 숫자 개수를 저장하기 위한 변수로, 숫자의 개수인 10 크기로 초기화한다.
  3. 생성 가능한 숫자를 count 배열에 추가한다.
    • 0 ~ 9 까지 영문자 중 고유하게 생성 가능한 영문자들의 개수를 먼저 센다.
    • 간단히 0 ~ 9 까지 숫자를 영문자로 변환해보면 아래와 같다.
    • 0 zero
      1 one
      2 two
      3 three
      4 four
      5 five
      6 six
      7 seven
      8 eight
      9 nine
    • zero, two, four, six, eight는 다른 숫자의 영문자 내 포함되지 않으므로 count의 각 숫자 위치에 charCount에서 굵은 영문자에 해당하는 ASCII 코드 값의 위치 값을 넣어준다.
    • 그 다음 계산이 필요한 항목들을 아래와 같이 계산한다.
      • three의 경우, eight가 존재하기 때문에 count[3]에 charCount에서 ‘h’의 ASCII 코드 값의 위치 값인 charCount[‘h’]에 count[8]을 뺀 값을 넣어준다.
      • five의 경우, four가 존재하기 때문에 count[5]에 charCount에서 ‘f’의 ASCII 코드 값의 위치 값인 charCount[‘f’]에 count[4]을 뺀 값을 넣어준다.
      • seven의 경우, six가 존재하기 때문에 count[7]에 charCount에서 ‘s’의 ASCII 코드 값의 위치 값인 charCount[’s’]에 count[6]을 뺀 값을 넣어준다.
      • nine의 경우, five와 six, eight가 존재하기 때문에 count[9]에 charCount에서 ‘i’의 ASCII 코드 값의 위치 값인 charCount[‘i’]에 count[5], count[6], count[8]의 값들을 빼준다.
      • one의 경우, sevennine이 존재하기 때문에 count[1]에 charCount에서 ‘n’의 ASCII 코드 값의 위치 값인 charCount[‘n’]에 count[7]의 값을 빼고 9에는 n이 2개 들어가므로 count[9]는 2배로 빼준다.
  4. 숫자를 오름차순 문자열로 만들어 생성하기위한 sb를 StringBuilder로 초기화한다.
    • 동적 문자열의 생성시, 효율적인 메모리 사용을 위해 StringBuilder를 사용한다.
  5. 0부터 9까지 i를 증가시키며 반복한다.
    • 0부터 count[i]의 값까지 j를 증가시키며, sb에 j의 수만큼 반복하여 i를 넣어준다.
  6. 반복이 완료되면 문자열 s를 오름차순의 숫자를 이어준 sb를 문자열로 변환하여 주어진 문제의 결과로 반환한다.

소스

Sample Code는 여기에서 확인 가능합니다.

댓글남기기