숫자 문자열과 영단어

seheeee_97·2023년 11월 17일
0

회고팀

목록 보기
14/41

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.





class Solution {
    public int solution(String s) {
        int answer = 0;

        String[] words = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

        String word = "";       //현재 읽고있는 단어를 저장할 변수

        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {     //숫자인지 여부 확인, 숫자면 true
                answer = answer * 10 + Character.getNumericValue(c);        //*10 은 자릿수를 올리는 역할
            } else {
                word += c;      //word에 영단어 입력

                for (int i = 0; i < words.length; i++) {
                    if (word.equals(words[i])) {        //현재까지 읽은 영단어가 배열에 있는지 확인
                        answer = answer * 10 + i; 
                        word = "";
                    }
                }
            }
        }
        return answer;
    }
}










-> map 버전

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int solution(String s) {
        int answer = 0;
        
        Map<String, Integer> number = new HashMap<>();
        number.put("zero", 0);
        number.put("one", 1);
        number.put("two", 2);
        number.put("three", 3);
        number.put("four", 4);
        number.put("five", 5);
        number.put("six", 6);
        number.put("seven", 7);
        number.put("eight", 8);
        number.put("nine", 9);
        
        String Word = "";		//현재 읽고있는 단어를 저장할 변수
        
        for (char c : s.toCharArray()) { 	//문자열 순회
            if (Character.isDigit(c)) { 	//c가 숫자인지 확인, 숫자면 true
                answer = answer * 10 + Character.getNumericValue(c); // 자릿수를 올리는 역할
            } else {
                Word += c;

                if (number.containsKey(Word)) { // 현재까지 읽은 영단어가 매핑되어 있는지 확인
                    answer = answer * 10 + number.get(Word); //Word를 숫자로 변환하여 계산
                    Word = ""; // 초기화
                }
            }
        }
        return answer;
    }
}







->StringBuilder 버전

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int solution(String s) {
        int answer = 0;
        
        Map<String, Integer> number = new HashMap<>();
        number.put("zero", 0);
        number.put("one", 1);
        number.put("two", 2);
        number.put("three", 3);
        number.put("four", 4);
        number.put("five", 5);
        number.put("six", 6);
        number.put("seven", 7);
        number.put("eight", 8);
        number.put("nine", 9);
        
        StringBuilder Word = new StringBuilder();   //현재까지 읽은 영단어를 저장, StringBuilder는 문자열을 동적으로 조작하는 데 사용됨

        for(char c : s.toCharArray()) {    //문자열 순회
            if(Character.isDigit(c)) {     //숫자인지 여부 확인, 숫자면 true
                answer = answer * 10 + Character.getNumericValue(c);    //자릿수를 올리는 역할
            } else {
                Word.append(c);     //append는 StringBuilder에서 문자열을 추가하는 메서드

                if(number.containsKey(Word.toString())) {  //현재까지 읽은 영단어가 매핑되어 있는지 확인
                    answer = answer * 10 + number.get(Word.toString());     //맵에서 Word에 해당하는 키 반환
                    Word = new StringBuilder();     //초기화
                }
            }
        }
        return answer;
    }
}








StringBuilder 예제

StringBuilder stringBuilder = new StringBuilder();

// 문자열 추가
stringBuilder.append("Hello");

// 문자열 연결
stringBuilder.append(" World");

// 문자열 삭제
stringBuilder.delete(5, 10); // "HelloWorld"에서 인덱스 5부터 9까지의 문자를 삭제

// 문자열 변경
stringBuilder.replace(0, 5, "Hi"); // "HiWorld"

// 결과 출력
System.out.println(stringBuilder.toString()); // 출력 결과: HiWorld

0개의 댓글