프로그래머스 Lv.1 - 12930 이상한 문자 만들기 문제 풀이
문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다.
각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
문제의 자세한 내용은 해당 링크를 통해 확인 : 문제 링크
풀이 코드
class Solution {
public String solution(String s) {
StringBuilder ret = new StringBuilder(); // 반환할 문자열을 담을 StringBuilder 타입 변수 생성
for(String str : s.split(" ", -1)) { // 입력받은 문자열 s를 공백 단위로 파싱, 마지막 공백 포함
for(int i = 0; i < str.length(); i++) { // 공백 단위로 파싱된 문자열의 길이만큼 반복
if(i % 2 != 0) { // 만약 i값이 홀수면
ret.append(Character.toLowerCase(str.charAt(i))); // 문자열의 i번째 인덱스를 소문자로 변환 후 ret에 추가
} else { // 만약 i값이 짝수면
ret.append(Character.toUpperCase(str.charAt(i))); // 문자열의 i번째 인덱스를 대문자로 변환 후 ret에 추가
}
}
ret.append(" "); // ret에 공백 추가
}
return ret.substring(0, ret.length() - 1); // ret의 마지막 공백을 제외하고 String 타입 변환하여 반환
}
}
문제 해결 전략
이라 쓰고 문제를 보고서 어떻게 풀면 될까?에 대한 생각을 정리한 항목
문제에서 문자열의 공백을 기준으로 파싱이 필요하다는 내용을 보자마자 split() 메서드 사용을 떠올리고, 입력받은 문자를 변환한 후 반환해야 한다는 내용 확인 후 StringBuiler로 만들어서 반환을 해야겠다고 생각
따라서 StringBuiler 변수를 생성 후, 입력받은 문자열에 split() 메서드를 사용하여 공백 기준 파싱된 문자열을 향상된 for문에 대입하여 사용하는 코드 작성
이후 파싱된 문자열의 길이만큼 돌면서 인덱스 기준으로 홀수와 짝수를 판별 후 대소문자로 변환하여 ret 변수에 추가
파싱된 문자열의 대소문자 변환이 끝났다면 ret에 공백을 추가 (공백 기준으로 파싱했기 때문에 공백을 추가해줘야 원본 문자열과 동일한 문자열이 만들어지기 때문)
모든 문자열의 대소문자 변환이 끝났다면 StringBuilder 타입에서 String 타입으로 변환이 필요하기 때문에 toString() 메서드를 사용하면 되지만.. 문자열 마지막에 추가되었을 공백을 제거해야하기 때문에 trim() 메서드를 떠올림
하지만 trim() 메서드의 경우 문자열의 맨 앞과 맨 뒤에 있는 모든 공백을 제거하기 때문에 원본 문자열의 맨 앞과 맨 뒤에 공백이 있는 경우가 들어온다면 실패하기 때문에 제외
따라서 substring() 메서드를 활용하여 ret의 길이에서 1을 뺀 문자열을 String 타입으로 변환하여 반환하도록 구현
여기까지 진행 후 테스트 실행시 4, 5, 8, 9, 11번 케이스에서 실패가 발생
무엇이 문제일지 고민을 시작하였으나 일반적인 문자의 경우에는 정상인 코드가 맞으므로 공백 관련된 문제로 인식
따라서 공백을 기준으로 파싱하는 split() 메서드에 대해서 찾아보기 시작
찾아보던 중 split() 메서드를 첫번째 매개변수만 지정하여 사용하게 되면 길이가 0인 문자열은 제외됨을 확인
이 문제의 해결 방법으로는 split() 메서드에 2개의 매개변수를 사용할 때, 2번째 매개변수에 음수를 넣으면 길이가 0인 문자열도 포함하여 나오도록 할 수 있음을 확인 (링크)
이를 확인하고 split() 메서드의 코드를 수정 후 테스트 진행하여 성공 확인
해당 문제를 풀면서 split() 메서드의 동작에 대해 좀 더 알 수 있는 계기가 되었다.
코드를 업로드해 둔 깃 허브
'Develop > Algorithm' 카테고리의 다른 글
백준 브론즈I - 10989 수 정렬하기 3 (0) | 2022.07.26 |
---|---|
백준 실버V - 2751 수 정렬하기 (0) | 2022.07.26 |
백준 브론즈II - 5622 다이얼 (0) | 2022.07.26 |
Java BufferedReader, BufferedWriter 사용법 (0) | 2022.07.26 |
백준 코드 작성시 참고 항목 (0) | 2022.07.26 |