2023-06-07 TIL (Java 프로그래머스 문풀, 팀 과제)
오늘 학습한 내용
- Java : 팀 과제 (호텔 예약 프로그램)
- 프로그래머스 문풀
문제상황
평소에 알고리즘 문제를 풀 때 문자열을 어떤 기준으로 나누어서 배열로 바꾸어주는 split 메소드와 특정 문자열을 바꾸어주는 replaceAll 메소드를 많이 활용한다.
그런데 오늘 문제에서는 둘을 동시에 사용하는데 확신을 가지지 못했던 부분을 확인했던 부분을 TIL에 기록하게 되었다.
문제는 '숨어있는 숫자의 덧셈(2)'이다.
https://school.programmers.co.kr/learn/courses/30/lessons/120864
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
시도한 내용
내가 문제에 접근한 방식은 다음과 같다.
- replaceAll 메소드를 활용하여 0부터 9까지의 숫자문자형이 아닌 문자를 공백으로 바꾼다.
- 공백 기준으로 문자열을 나눈다. (split 메소드 활용)
- 빈 문자열이 아닌 배열 원소를 정수형으로 바꾼 뒤 더해준다.
여기서 궁금했던 점은 공백으로 바뀐 함수를 공백을 기준으로 문자열 배열로 나누는 과정에서 배열이 어떻게 구성되는가였다. 생각한 후보는 다음과 같다.
문자열 "aAb1B2cC34oOp"를 기준
- [1, 2, 34] => 공백으로 바뀐 문자열 사이에 있는 빈 문자열을 담지 않는다.
- [, , , 1, 2, , 34] => 공백으로 바뀐 문자열 사이에 있는 빈 문자열을 배열에 담는다.
확인하기 위해 작성한 코드는 다음과 같다.
import java.util.*;
public class Solution {
public static void main(String[] args) {
String str = "aAb1B2cC34oOp";
str = str.replaceAll("[^0-9]", " ");
String[] strArr = str.split(" ");
System.out.println(Arrays.toString(strArr));
}
}
결과는 다음과 같다.
[, , , 1, 2, , 34]
즉, 공백을 기준으로 나뉘었을 때 공백 사이에 있는 빈 문자열도 모두 배열에 담기는 것이다.
상식적으로는 빈 문자열도 문자열이기 때문에 당연히 배열에 담긴다고 생각할 수 있지만 충분히 헷갈리 수 있는 부분이라 생각한다. 앞으로는 헷갈리지 않게 꼭 기억하고 있어야겠다.
해결
위의 내용을 토대로 문제 해결을 위해 작성한 코드는 다음과 같다.
class Solution {
public int solution(String my_string) {
int answer = 0;
// 알파벳 문자 => 공백으로 바꾸기
my_string = my_string.replaceAll("[^0-9]", " ");
// 공백 기준으로 문자열 나누기
String[] strArr = my_string.split(" ");
// "aAb1B2cC34oOp" 기준 => [, , , 1, 2, , 34]
// 빈 문자열이 아닌 배열 원소 정수형으로 바꾼 뒤 더해주기
for(int i=0; i<strArr.length; i++) {
if(!(strArr[i].equals(""))) {
int a = Integer.parseInt(strArr[i]);
answer += a;
}
}
return answer;
}
}
알게된 내용
가끔 문제를 풀다보면 평소에는 당연하게 생각했던 부분도 헷갈리는 순간이 있다. 역시 기초가 탄탄하지 않고, 경험이 많지 않기 때문이라고 생각한다. 앞으로 이 부분을 신경쓰면서 알고리즘 문제를 풀다보면 기초도 더욱 탄탄해지고, 기본적인 내용을 헷갈리지 않을 것이라 생각한다.
+) 스터디를 통해서 알게된 내용인데, split 메소드에서도 정규식을 사용할 수 있었다.
즉, 내가 수행한 replaceAll을 생략하고 바로 split 메소드와 정규식을 사용하여 문자열을 배열로 나눌 수 있었다.