Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 갭체크
- 항해99
- 티스토리챌린지
- 개발자취업
- 연결 리스트
- Java
- 파이썬
- 코딩테스트준비
- 1일1코테
- 자바
- C
- 99클럽
- 데이터베이스
- 코딩테스트
- 개발자루틴
- 코테공부
- 자바스크립트
- 프로그래밍 언어
- 오블완
- 프로그래머스
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 운영체제
- 알고리즘
- 자료구조
- 플로이드-워셜
- 코딩테스트사이트추천
- til
- 웹
- 코드트리
- 인접 행렬
Archives
- Today
- Total
와드의 블로그
숫자 문자열과 영단어 본문
문제
네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 문자열을 주었습니다. 이 문자열을 원래 숫자로 복원하여 반환하는 문제입니다.
예를 들어 "one4seveneight"이라는 문자열이 주어지면, 이를 1478이라는 정수로 변환하여 반환해야 합니다.
- 입력: 영단어와 숫자가 섞인 문자열 s (길이 1 이상 50 이하)
- 출력: 복원된 정수
링크: https://school.programmers.co.kr/learn/courses/30/lessons/81301
풀이 1: 문자열 파싱
1. 문자 판별 및 변환
알파벳일 경우, 각 숫자를 나타내는 영단어의 첫 글자가 고유하다는 점을 이용합니다.
- z -> zero
- o -> one
- e -> eight
- n -> nine
첫 글자가 겹치는 경우에는 바로 다음 글자(i + 1)를 확인하여 구분합니다.
- t -> two / three
- f -> four / five
- s -> six / seven
문자열을 순회하면서 현재 문자가 숫자인지 영단어의 알파벳인지 확인합니다.
2. 인덱스 점프
단어를 판별한 후에는 해당 영단어의 길이만큼 인덱스 i를 건너뛰어 불필요한 탐색을 방지합니다. 공통적으로 적용되는 i++를 고려하여 단어 길이보다 1 작게 인덱스를 더해줍니다.
3. 결과값 누적
문자열을 정수로 이어 붙이기 위해, 새로운 숫자를 더하기 전에 기존 정수 값(ans)에 10을 곱하여 자릿수를 하나씩 올려주는 방식을 사용합니다.
코드 1: 직접 문자열 파싱
class Solution {
public int solution(String s) {
int ans = 0;
for (int i = 0; i < s.length(); ) {
char c = s.charAt(i);
// 자릿수 올림
ans = ans * 10;
// 1. 숫자인 경우
if (c >= '0' && c <= '9') {
ans += c - '0';
}
// 2. 영단어인 경우 첫 글자(및 두 번째 글자)로 숫자 유추
else if (c == 'z') { // zero
i += 3;
} else if (c == 'o') { // one
ans += 1;
i += 2;
} else if (c == 't') {
if (s.charAt(i + 1) == 'o') { // two
ans += 2;
i += 2;
} else { // three
ans += 3;
i += 4;
}
} else if (c == 'f') {
if (s.charAt(i + 1) == 'o') { // four
ans += 4;
} else { // five
ans += 5;
}
i += 3;
} else if (c == 's') {
if (s.charAt(i + 1) == 'i') { // six
ans += 6;
i += 2;
} else { // seven
ans += 7;
i += 4;
}
} else if (c == 'e') { // eight
ans += 8;
i += 4;
} else { // nine (나머지 경우는 n으로 시작하는 nine뿐임)
ans += 9;
i += 3;
}
// 다음 문자로 이동 (영단어의 경우 위에서 길이-1 만큼 이미 더해짐)
i++;
}
return ans;
}
}
풀이 2: replaceAll 메서드 활용
두 번째 방식은 자바의 내장 메서드인 replaceAll()을 활용하는 방법입니다. 코드가 매우 간결해집니다.
- 단어 배열 선언:인덱스와 숫자가 일치하도록 0부터 9까지의 영단어를 순서대로 배열에 선언합니다.
- 문자열 치환:0부터 9까지 반복문을 돌며, replaceAll()을 사용해 문자열 내에 존재하는 영단어를 해당하는 숫자(인덱스 값)로 치환합니다.
- 정수형 변환:모든 영단어가 숫자로 치환된 문자열을 Integer.parseInt()를 통해 정수형으로 변환하여 반환합니다.
코드 2: replaceAll 메서드 활용
class Solution {
public int solution(String s) {
// 인덱스와 숫자가 일치하도록 영단어 배열 선언
String[] words = {"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"};
// 0부터 9까지 순회하며 문자열 내의 영단어를 숫자로 치환
for (int i = 0; i < 10; i++) {
s = s.replaceAll(words[i], String.valueOf(i));
}
// 변환된 문자열을 정수형으로 반환
return Integer.parseInt(s);
}
}