<문제 제시>
<문제설명>
문자열 my_string이 매개변수로 주어집니다.
my_string은 소문자, 대문자, 자연수로만 구성되어있습니다.
my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
<예시 입출력>
<문제 해결 과정>
'숨어있는 숫자의 덧셈 (1)'과의 차이점은
1. 연속된 수를 하나의 숫자로 간주한다는 점과 (이 경우 1, 2, 34)가 검출될 경우 (1)에서의 답 10이 아닌 37이 리턴된다.
2. 문자열에 자연수가 없는 경우에는 0을 반환한다는 것이다.
'숨어있는 숫자의 덧셈 (1)' 의 코드를 조금 수정하여 if(Character)를 판단하는 부분인
public static int solution(String my_string) {
int answer = 0;
for(int i = 0; i < my_string.length(); i++) {
if(Character.isDigit(my_string.charAt(i))) {
answer += my_string.charAt(i) - 48;
}
}
return answer;
}
에서 answer에 바로 더해주는 것이 아닌 최초 정수 발견 후 문자를 발견할때까지의 인덱스를 기억하고
그 인덱스를 토대로 분리해내어 더해주어야할 것 같았다.
Try 1)
int answer = 0;
int start_i = 0;
int end_i = 0;
String split_string = my_string;
String just_num = "";
int last = split_string.length();
for(int i = 0; i < my_string.length(); i++) {
if(Character.isDigit(my_string.charAt(i))) {
split_string = my_string.substring(i, last);
System.out.println("검출된 숫자 = " + my_string.charAt(i) + ", 검출된 숫자의 인덱스 = " + i);
start_i = i;
for(int j = 0; j < split_string.length(); j++) {
if(Character.isLetter(split_string.charAt(j))){
end_i = j;
just_num += my_string.charAt(i) + ",";
System.out.println("잘라낸 문자열에서 숫자만 = " + just_num);
break;
}
}
}
}
return answer;
34는 연속된 숫자이지만 substring으로 잘라내보려한 결과 인덱스범위 문제가 발생하였다.
다른 방법으로 판단해봤지만 모두 분할로 저장되어 1,2,3,4가 각각 분할된 값으로 출력되었다.
Solution 1)
// 소문자 알파벳 '이거나(or)' 대문자 알파벳 검출
String[] just_num = my_string.split("[a-zA-Z]");
// <삼항연산자 활용>
// 공백 포함 숫자만 담아낸 문자열 배열이
// true) 공백이면 0을 반환하여 answer에 누적
// false) 공백이 아니면 answer에 정수형으로 변환 후 더해준다.
for(int i = 0; i < just_num.length; i++) {
answer += just_num[i].isEmpty() ? 0 : Integer.parseInt(just_num[i]);
}
정규표현식을 통해 소문자 알파벳과 대문자 알파벳을 검출한다.
코드에서는 두번째 인자가 작성되어있지 않지만, limit = 0과 같은 의미로 첫번째 인자에 해당하는 조건을 공백으로 둔다는 것이다.
이 과정을 통해 추출해낸 just_num 문자열 배열을 검사하며, 공백이면 0을 누적하고, 공백이 아닌 경우 (숫자이므로)
Integer.parseInt로 정수형 변환 후 answer에 누적한다.
<전체코드>
import java.util.Arrays;
public class hide_NumOdd2 {
public static int solution(String my_string) {
int answer = 0;
// 소문자 알파벳 '이거나(or)' 대문자 알파벳 검출
String[] just_num = my_string.split("[a-zA-Z]");
System.out.println(Arrays.toString(just_num));
// 공백 포함 숫자만 담아낸 문자열 배열이 공백이면 0을 반환하여 answer에 누적하고, 공백이 아니면 answer에 정수형으로 변환 후 더해준다.
for(int i = 0; i < just_num.length; i++) {
answer += just_num[i].isEmpty() ? 0 : Integer.parseInt(just_num[i]);
}
return answer;
}
public static void main(String[] args) {
String my_string = "aAb1B2cC34oOp";
System.out.println(solution(my_string));
}
}
숨어있는 숫자의 덧셈(1)의 코드를 일부 활용하였지만, 정규표현식 사용법이나, 삼항연산자를 활용하는 방법 등
분명히 더 알아야할 것이 많았던 알고리즘이었다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120864
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '삼각형의 완성조건 (2)' - Java (1) | 2023.05.17 |
---|---|
[프로그래머스] '안전지대' - Java (0) | 2023.05.16 |
[프로그래머스] '다항식 더하기' - Java (0) | 2023.05.15 |
[프로그래머스] '최댓값 만들기 (2)' - Java (0) | 2023.05.15 |
[프로그래머스] '직사각형 넓이 구하기' - Java (0) | 2023.05.14 |