정답 1
이문제는 처음에 나한테 큰 혼란을 주었다. IntStream 은 이제 어느정도 사용하는데 익숙해졌는데 반대로 String 을 가지고 노는데에는 어려움을 느꼈다.
먼저 저 숫자들만 가져와 배열을 만드는게 우선이라 판단했고 그다음 그 배열의 요소들을 모두 int 타입으로 바꿔준다음 전부 합하면 될것이라 판단하고 아래와 같은 로직을 도출했다.
import java.util.Arrays;
class Solution {
public int solution(String my_string) {
String intStr = my_string.replaceAll("[^0-9]", "");
return Arrays.stream(intStr.split("")).mapToInt(d -> Integer.valueOf(d)).sum();
}
}
먼저 replaceAll 을 사용해 정규식으로 숫자들만 뽑아내어 문자열로 만들었다.
replaceAll() 의 장점은 정규식을 사용하여 replace() 의 한계를 뛰어넘을 수 있다는 것이다. 좀더 많고 다양한 작업을 한번에 처리할 수 있어서 좋다.
상기 답안 로직에서 사용된 정규식은 [^0-9] 이다. 이 정규식의 의미는 "숫자 0-9 까지가 아닌" 이다.
반대로 [0-9] 만 적게 되면 "숫자 0-9 까지" 라는 의미를 갖게 된다.
그래서 .replaceAll("\[^0-9\]", "");
는 0 부터 9까지의 숫자가 아닌 나머지를 "" 로 replace 하겠다! 라는 뜻이다.
그렇게 숫자만 가져와 String 값을 만들고 이것을 splite() 하여 String[] 배열로 만든다음 각각의 내부 요소들을 mapToInt 를 사용해 int 값으로 만든다음 .sum() 으로 모두 합한 값을 반환시켰다.
결과는 정답!!
다른 사람들의 정답 로직도 확인해보자. 실력을 높이려면 다른 코드 로직들 또한 보면서 감상할 줄 알아야 한다!!
코드는 예술이야,,
정답 2
정말 솔직하게 별 기대 안하고 다른 사람들의 답을 확인했는데 와,,, 아래 로직은 나한테 약간의 예술이였다.
class Solution {
public int solution(String myString) {
return myString.chars().mapToObj(i -> (char) i).filter(Character::isDigit).map(String::valueOf).mapToInt(Integer::valueOf).sum();
}
}
1. .chars() 를 통해 String 문자열을 IntStream 으로 convert 해준다. 그럼 문자열내에 각각의 문자(char)들이 모두 int 숫자로 바뀐다. (ex) 'a' = 49
2. 그다음 mapToObj() 를 통해 char 타입으로 형변환된 object-valued Stream 을 도출한 뒤 .filter() 와 Character 에 isDigit() 메서드를 활용해 숫자인 char 타입 요소들만 걸러낸다.
3. 그후 이 char 타입의 요소들을 .map() 에 String.valueOf 를 통해 String으로 convert 해준다. 여기서 String 으로 convert 해주는 이유는 char 상태에서 바로 Integer 로 형변환시키면 Ascii code 로 변환되어 의도하지 않은 전혀 다른 숫자로 반환된다. 그래서 String 으로 먼저 convert 한 후 그 String 값을 int 값으로 반환시켜주는 것이다.
4. 그다음 mapToInt() 에 Integer.valueOf 를 통해 IntStream 으로 바꿔준 후 .sum() 을통해 의도한데로 변환된 숫자들을 모두 합한 int 값을 반환하여 마무리 하였다.
char -> isDigit() -> String -> int
'프로그래머스 - 코딩테스트' 카테고리의 다른 글
[JavaScript][프로그래머스] - LVL.0 개미군단 (0) | 2023.02.11 |
---|---|
[Java][프로그래머스] - LVL.0 모음 제거 (0) | 2023.02.03 |
[Java][프로그래머스] - LVL.0 순서쌍의 개수 (0) | 2023.01.26 |
[Java][프로그래머스] - LVL.0 중복된 숫자 개수 (0) | 2023.01.26 |
[Java][프로그래머스] - LVL.0 문자 반복 출력하기 (0) | 2023.01.25 |