Algorithms/프로그래머스

[프로그래머스] '숨어있는 숫자의 덧셈 (2)' - Java

LEFT 2023. 5. 16. 21:48

<문제 제시>

<문제설명>
문자열 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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr