-
[Java] - 숫자 문자열과 영단어 (81301: 2021 카카오 채용연계형 인턴십)알고리즘/프로그래머스 2024. 2. 28. 12:28
📚 문제 - 81301
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
- 1478 → "one4seveneight"
- 234567 → "23four5six7"
- 10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요. 참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
숫자 영단어 0 zero 1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight 9 nine
제한사항- 1 ≤ s의 길이 ≤ 50
- s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
- return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.
입출력 예
s result "one4seveneight" 1478 "23four5six7" 234567 "2three45sixseven" 234567 "123" 123 - 입출력 예 #1
문제 예시와 같습니다. - 입출력 예 #2
문제 예시와 같습니다. - 입출력 예 #3
"three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다. 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다. - 입출력 예 #4
s에는 영단어로 바뀐 부분이 없습니다. 제한시간 안내
제한시간 안내
- 정확성 테스트 : 10초
⌨️ 작성한 코드
import java.util.HashMap; class Solution { public int solution(String s) { HashMap<String, Integer> map = new HashMap<>(); map.put("zero", 0); map.put("one", 1); map.put("two", 2); map.put("three", 3); map.put("four", 4); map.put("five", 5); map.put("six", 6); map.put("seven", 7); map.put("eight", 8); map.put("nine", 9); StringBuilder sb = new StringBuilder(); int i = 0; while (i < s.length()) { if (Character.isDigit(s.charAt(i))) { // 숫자인 경우 sb.append(s.charAt(i)); // 그대로 추가 i++; } else { // 영단어인 경우 // 영단어를 찾기 위해 연속된 문자열을 확인 for (int j = 3; j <= 5; j++) { String substr = s.substring(i, i + j); // 연속된 문자열을 추출 if (map.containsKey(substr)) { // 해당 영단어가 맵에 존재하는 경우 sb.append(map.get(substr)); // 숫자로 치환하여 추가 i += j; // 인덱스 업데이트 break; } } } } return Integer.parseInt(sb.toString()); } }
👀 좋아요 98개의 다른 사람의 풀이
class Solution { public int solution(String s) { String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; for(int i = 0; i < strArr.length; i++) { s = s.replaceAll(strArr[i], Integer.toString(i)); } return Integer.parseInt(s); } }
굉장히 간결하고 쉬운 코드라서 놀랐다...
✅ 배운 점
- replaceAll(String regex, String replacement): 문자열에서 특정 패턴을 찾아 해당 패턴을 대체 문자열로 모두 치환
정규표현식(regex)과 일치하는 부분을 대체 문자열(replacement)로 모두 치환한다. 여기서 regex는 치환하고자 하는 문자열 패턴을 나타내며, replacement는 치환될 문자열이다.
- 정규표현식 사용:
String original = "apple orange apple banana apple"; String replaced = original.replaceAll("apple", "kiwi"); System.out.println(replaced); // 출력: kiwi orange kiwi banana kiwi
- 공백 제거:
String original = " Hello, world! "; String replaced = original.replaceAll("\\s+", ""); // \\s+는 하나 이상의 공백에 대응되는 정규표현식 System.out.println(replaced); // 출력: HelloWorld!
- 대소문자 구분 없이 대체:
String original = "Hello world, hello everyone!"; String replaced = original.replaceAll("(?i)hello", "hi"); // (?i)는 대소문자를 구분하지 않도록 하는 플래그 System.out.println(replaced); // 출력: hi world, hi everyone!
- 정규표현식 사용:
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[Java] - K번째수 (42748) (0) 2024.02.29 [Java] - 푸드 파이트 대회 (134240) (String / StringBuffer & StringBuilder) (1) 2024.02.29 [Java] - 가장 가까운 같은 글자 (142086) (HashMap) (0) 2024.02.28 [Java] - 시저암호 (12926) (0) 2024.02.28 [Java] - 최소직사각형 (86491) (0) 2024.02.27