해당 문제는 while문을 실행하고, 그 안에 for문을 arr(문자들이 담긴 배열) 길이만큼 돌리고 돌리면서 앞의 글자가 배열의 글자 중 하나에 해당하면 startWith 메서드로 자르면서 result(문자열)에 현재 i (arr의 특정 문자의 인덱스를 의미하기도 함)를 합쳐주는 작업을 반복하고
최종적으로 numbers 문자열의 길이가 0일때, 그러니까 문자열을 다 잘랐을 때 while문을 빠져나와 합쳐진 result 문자열을 반환해주면 됩니다.
그럼 해당 공식을 적용한 자바스크립트 버전을 소개해 드리겠습니다.
- 자바스크립트 버전
function solution(numbers) { // arr 배열에 숫자들을 의미하는 문자열들을 하나 하나 담아주고 let arr = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]; // i (arr의 특정 문자에 해당하는 인덱스값)를 저장할 문자열을 result로 초기화 let result = ""; // 문자가 남아있는 한 계속 돌릴 while문 선언 while (numbers.length !== 0) { // for문을 arr 배열만큼 돌리면서 for (let i = 0; i < arr.length; i++) { // numbers 문자열이 arr의 i번째 요소로 시작할 때, 즉 같은 경우 if (numbers.startsWith(arr[i])) { // reulst 문자열에 현재 arr의 i번째 요소의 인덱스 값을 의미하기도 하는 i를 더하기 연산으로 이어 붙여주고 result += i; // slice를 이용해 arr의 현재 요소(i 번째)의 길이만큼 numbers에서 잘라내고 반환 받은 값을 numbers에 다시 할당 numbers = numbers.slice(arr[i].length); // 해당 단어 길이만큼 잘라냄 // 위의 조건에 맞는 코드가 실행될 경우 for문을 더 돌릴 필요가 없기 때문에 break로 빠져나오기 break; } } } // while문이 끝나면 result를 parseInt로 정수 변환 후 반환 return parseInt(result); }
그리고 자바 버전으로 구현한 코드는 다음과 같습니다.
- 자바 버전
class Solution { public int solution(String numbers) { String[] arr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; StringBuilder result = new StringBuilder(); while (numbers.length() != 0) { for (int i = 0; i < arr.length; i++) { if (numbers.startsWith(arr[i])) { result.append(i); numbers = numbers.substring(arr[i].length()); break; } } } return Integer.parseInt(result.toString()); } }
JS의 경우 배열의 생성이나 parseInt 메서드를 바로 호출하는게 가능한데, 자바의 경우 배열을 생성하는 방식이나 parseInt를 불러오는 방식에서 약간의 차이점이 있었습니다. 그러나 이것이 코드 구현에 있어서 어려움을 초래하지는 않았던 것 같습니다.
문자열(String) 메서드인 startWith 메서드는 같은 역할을 하기에 잘 안쓰는 메서드이긴 하지만 그래도 공통점이 있는 메서드로 기억할 수 있었습니다.
JS의 경우 문자열을 그냥 붙여주면 되지만, 자바의 경우 기본 타입을 제외하고도 Long, Integer 같은 래퍼 클래스도 불변인데, String도 불변하는 객체라 만약 문자열을 붙여주면 수시로 새로운 객체가 생성되어 메모리 낭비가 발생할 수 있습니다. 그래서 가변적인 길이의 문자열인 StringBuilder로 result 문자열을 생성해 반환값으로 활용했습니다.