문제
코딩테스트 연습 - 숫자 문자열과 영단어 | 프로그래머스 스쿨 (programmers.co.kr)
아이디어
[러프한 아이디어]
step1) 영어 단어가 존재하는지 탐색
step2) 존재하는 위치에서 char 하나만 남기고 삭제
step3) 남은 하나의 char은 숫자로 변환
[아이디어 구현]
step 1~3를 하며 문자열 수정이 자유롭도록 StringBuilder 사용
step1) 영어 단어가 존재하는지 탐색
: 단어가 담긴 자료구조를 돌면서 sb.indexOf(str)를 하고, -1이 아닐 경우 step2, 3으로 넘어간다.
step2) 존재하는 위치에서 char 하나만 남기고 삭제
: sb.delete(start, end) 이용 / 삭제 범위는 sb.indexOf(str) + 1 ~ sb.indexOf(str) + str.length()까지
step3) 남은 하나의 char은 숫자로 변환
: sb.setCharAt(int, char) 이용 / int를 char로 바꾸기 위해서 int + '0' 사용
코드
import java.util.*;
class Solution {
public int solution(String s) {
// step 0
StringBuilder sb = new StringBuilder(s);
List<String> numList = Arrays.asList( // 여기서 <String>을 안해주면 에러 발생
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine");
int check = 1;
while(check == 1){
check = 0;
// step 1 : 영어 단어가 존재하는지 탐색
for(int i = 0; i < numList.size(); i++){
int idx = 0; // 주어진 문자열에서 영단어의 위치
if(sb.indexOf(numList.get(i)) != -1){
// step 2 : 존재하는 위치에서 char 하나만 남기고 삭제
idx = sb.indexOf(numList.get(i));
sb.delete(idx+1, idx + numList.get(i).length());
// step 3 : 남은 하나의 char은 숫자로 변환
sb.setCharAt(idx, (char)(numList.indexOf(numList.get(i)) + '0'));
check = 1;
}
}
}
int answer = Integer.parseInt(sb.toString());
return answer;
}
}
새롭게 알게된 것
[Stream]
스트림은 java.util.stream에 포함되므로 import java.util.*; 가 아니라 import java.util.stream.*; 를 적어줘야 한다.
❗스트림은 일회용이다. 따라서 반복문 안에 사용할 수 없다.
[List 간단하게 초기화하는 방법]
Arrays.asList( ) 을 사용하면 된다.
e.g List list = Arrays.asList("one", "two);
[int to char]
'0'을 더하고 char 형으로 받으면 된다.
e.g
int i = 9;
char c = i + '0'; // c=='9'
'Algorithm > 알고리즘 문제' 카테고리의 다른 글
백준 5397번 : 키로거 (0) | 2023.06.25 |
---|---|
백준 1406번 : 에디터 (0) | 2023.06.24 |
백준 2608번 : 로마 숫자 (0) | 2023.06.23 |
백준 1158번 : 요세푸스 문제 (0) | 2023.05.16 |
백준 26008번 : 해시 해킹 (1) | 2023.05.15 |