카카오 채용연계형 인턴십 코딩 테스트에 나왔던 문제로서
input: "one4seveneigth" (String)
output: 1478 (int)
즉 one, two 와 같은 문자열을 숫자 1, 2 로 대치하여 int 형태로 반환하는 문제이다.
package Programmers_nbc;
public class Pr_46 {
static class Solution {
public static int solution(String s) {
int answer = 0;
String[] number = { "zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine" };
for (int i = 0; i < number.length; i++) {
s = s.replace(number[i], String.valueOf(i));
//number[i] 와 일치하는 것을 모드 String.valueOf(i) 값으로 변경한다.
//replace와 replaceAll 의 결과가 동일하다
}
answer = Integer.parseInt(s);
return answer;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Solution.solution("one4"));
}
}
=> 문자열을 대치 할 수 있는 replace 함수를 검색해서 해당 함수를 해결하여 그렇게 어렵지 않게 해결하였지만 위 for 문 내부의 replace 를 replaceAll 로 바꿔도 정답처리가 되었다. 그렇다면 무엇이 다르기에 replace 와 replaceAll 메서드가 따로 있는 것인지 알아보고 싶어서 조사해보았다.
String str = "onetwothreefourfiveone";
str = str.replace("one","One");
//replace(기존문자, 바꿀문자)
System.out.println(str);
// "OnetwothreefourfiveOne"
=> replace 는 해당하는 문자열을 특정한 문자열로 치환한다.
String str = "onetwothreefourfiveone";
str = str.replaceAll("one","One");
//replaceAll(정규표현식, 바꿀문자)
System.out.println(str);
// "OnetwothreefourfiveOne"
=> replacAll 또한 replace 와 같이 특정 문자를 찾아서 모두 문자열을 치환해 주는 것 처럼 보이지만 첫번째 인자로 정규표현식 이 들어간다는 차이점이 있다 따라서 아래와 같은 코드에서는 예상치 못한 결과가 나오게 된다.
String str = "one.twothreefourfive.one";
str = str.replaceAll(".","/");
//replaceAll(정규표현식, 바꿀문자)
System.out.println(str);
// "////////////////////////"
// replace(".","/"); 를 하게 되면
// "one/twothreefourfive/one" 이 된다.
=> 정규표현식 . 은 모든 문자를 선택하라는 의미로서 따라서 모든 문자가 / 로 치환되게 된다.
String str = "onetwothreefourfiveone";
str = str.replaceFirst("one","One");
//replaceFirst(기존문자, 바꿀문자)
System.out.println(str);
// "Onetwothreefourfivone"
=> 이전 메서드들은 모든 해당하는 문자열을 치환하는 반면 replaceFirst의 경우는 처음으로 나오는 해당되는 문자만 치환하는 것을 알 수 있다.