TIL/알고리즘

[JAVA] 프로그래머스 | 81301 숫자 문자열과 영단어

쑤키다요 2025. 4. 1. 23:56

 

 

📝 TIL

- [프로그래머스] 81301 숫자 문자열과 영단

 

제한사항

1 ≤ s의 길이 ≤ 50

s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.

return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

 

 

입출력 예

입출력 예 #1

s result
"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567

 


🦔 설계 및 시도

처음에 map으로 넣을까 하다가 put 을 10번 쓰기가 귀찮아서

String 배열을 생성한 후 값을 넣었다.

 

1. String[] 배열에 zero~ten 넣기

(만약 중간에 숫자가 비어있거나, 랜덤값이라면 map을 사용해야함)

2. replace() 메서드를 사용하여 변환

 

위 방식을 사용하였는데, 에러가 발생했다.

 

에러 코드

s = s.replace(num[i], i);

 

처음에 replace(String, int) 형식으로 작성했었는데,

replace의 두번째 값에는 int를 넣을 수가 없었다!

 

🔥 풀이에 사용된 개념

String.replace(String target, String replacment)

- 문자열에서 특정 부분(target)을 찾아 다른 문자열로 치환(replacement)함

- 모든 일치 항목을 바꾸고, target과 replacement는 모두 문자열(String)이어야 한다

- 만약, 처음 하나만 바꾸고 싶다면? replaceFirst()

 

 

Interger.parseInt(String s)

- 문자열 형태의 숫자를 정수(int)로 변환하는 메서드

- 만약 문자열이 숫자로 변환할 수 없다면? NumberFormatException 


 

💡 풀이 소스 코드

 

시간복잡도 : O(m) / 숫자 단어 배열 길이 : 10, 길이가 m인 문자열에서 대

공간복잡도 : O(1)

 

public int solution(String s) {
    String[] num = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    
    for (int i = 0; i < num.length; i++) {
        s = s.replace(num[i], Integer.toString(i));
    }
    return Integer.parseInt(s);
}

 


🚀 새로 배운 내용

- 문자열 자체가 숫자라면, int 형으로 변환할 수 있고 방법은 Integer.parseInt(String s)

- 반대로 숫자를 그냥 문자열로 변환한다면? Integer.toString(int n)

- 객체를 문자열로 바꿀 때는? String.valueOf(int n)

 


😺  느낀점

- replace()를 거의 안 써본 거 같은데, 쓰니까 확실히 문자열을 치환할 때 편하다!

- 숫자 배열 -> 인덱스 연결은 자주 나오니 잘 기억해두자.

- 처음에 향상된 for문으로 작성하여 indexOf를 사용해야 하나? 생각했는데,

인덱스를 사용할 때는 향상된 for문보다 일반 for문이 더 활용하기 좋다!

 

 


*소스 코드는 다음 깃허브에 올라옵니다 - https://github.com/s0ooo0k/Algorithm_Study

 

GitHub - s0ooo0k/Algorithm_Study: Algorithm Study 문제 및 풀이

Algorithm Study 문제 및 풀이. Contribute to s0ooo0k/Algorithm_Study development by creating an account on GitHub.

github.com