[프로그래머스/Java] Lv.0 세 개의 구분자

febCho·2024년 3월 16일
0

코딩테스트

목록 보기
91/253
post-thumbnail

문제

임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.

예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.

문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.

- 제한사항

  • 1 ≤ myStr의 길이 ≤ 1,000,000
  • myStr은 알파벳 소문자로 이루어진 문자열 입니다.

풀이

내가 풀이한 것 중에 역대급으로 메모리를 많이 잡아먹은 풀이가 아니었나 한다.

split()으로 일괄되게 나누기 위해 Collections.replaceAll()로 a, b, c를 모두 임의의 문자열 "0"으로 바꾸어준다. 그 다음엔 String.join()으로 List 객체를 합쳐 하나의 문자열로 다시 만든다.

그 다음엔 contains()0이 포함되어 있는지 체크한 뒤 0을 구분자로 나누어 준다. 3개의 테스트 케이스 모두 a, b, c 셋 중 하나가 포함되어 있었지만 채점 시에는 없는 경우도 존재할 거라고 생각해서 그렇게 풀이했다.

split()을 이용하면 배열에 빈 문자열도 담기기 때문에 이를 없애 주기 위해 확장 for문으로 배열을 돌면서 빈 문자열이 아닌 경우에만 List 객체에 담아주었다. 그리고 3번 케이스처럼 a, b, c로만 이루어져 List 객체에 담긴 게 없는 경우에는 {"EMPTY"}를 반환한다.

마지막으로 toArray()로 반환 타입인 문자열 배열 형태로 List 객체를 변환해주면 풀이가 완료된다.

import java.util.*;

class Solution {
    public String[] solution(String myStr) {
        List<String> myStrList = Arrays.asList(myStr.split(""));
        Collections.replaceAll(myStrList, "a", "0");
        Collections.replaceAll(myStrList, "b", "0");
        Collections.replaceAll(myStrList, "c", "0");
        
        String newStr = String.join("", myStrList);
        String[] answer;
        
        if(newStr.contains("0")){
            answer = newStr.split("0");
            
            List<String> resultList = new ArrayList<>();
            for (String s : answer) {
                if (!s.isEmpty()) {
                    resultList.add(s);
                }
            }
            
            if (resultList.isEmpty()) {
                return new String[]{"EMPTY"};
            }
            
            answer = resultList.toArray(new String[resultList.size()]);
        } else {
            return new String[]{"EMPTY"};
        }
        
        return answer;
    }
}

결과

profile
Done is better than perfect.

0개의 댓글