프로그래머스 - 세 개의 구분자

박철현·2023년 7월 31일

프로그래머스

목록 보기
41/80

프로그래머스 - 세 개의 구분자

import java.util.ArrayList;
import java.util.List;

class Solution {
	public String[] solution(String myStr) {
		List<String> list = new ArrayList<>();

		// 첫 시작 인덱스
		int index1 = -1;
		// 끝나는 인덱스 (a, b, c 중 하나 직전) => 변수 없어도 되나 가독성 증가
		int index2 = -1;

		// 전체를 돌면서 검사
		for (int i = 0; i < myStr.length(); i++) {
			char tmp = myStr.charAt(i);
			// 구분자가 아니다 -> 그러면 단어 시작을 나타냄
			if (!(tmp == 'a' || tmp == 'b' || tmp == 'c')) {
				index1 = i;
				// 단 구분자를 다 지나고 마지막일 경우 단어를 추가
				// ex) abcd -> d
				if(i == myStr.length()-1 && index1 == i) {
					list.add(myStr.substring(i));
				}
			}
			// 구분자를 만남 -> 단어 시작이 아니니깐 다음 단어 검사
			// 다음 for문을 실행하지 않음
			else
				continue;

			// 구분자가 아닐 경우, 다음 구분자를 만나기 전까지의 단어를 추출하여 리스트에 넣기 위함
			for(int k =i+1; k<myStr.length(); k++) {
				char tmp2 = myStr.charAt(k);
				// index1이 -1이 아니라면, 원래 구분자가 아닌 시작하던 지점이 있으니 거기부터 추출
				if (index1 != -1) {
					if ((tmp2 == 'a' || tmp2 == 'b' || tmp2 == 'c')) {
						index2 = k;
						list.add(myStr.substring(index1, index2));
						// 추출 했으니 다시 초기화
						index1 = -1;
						// k번째 단어 까지는 검사를 했으니 k번째부터 다시 반복
						// 위 조건에 의해 k번째가 구분자지만, k+1이 아닌 이유는
						// 해당 for문이 break가 된 시점에 i=k 이기에, 다음 반복문에는 i=k+1이 되기 때문
						i=k;
						break;
					}
					// 만일 현재 문자가 구분자가 아니고, 바로 다음 문자가 문장의 끝이라면
					// 가장 마지막 단어이니 리스트에 넣고, i를 k로 갱신
					// 이렇게 되면 i = length -1 이라서 다음 루프도 한번 돌 것 같지만
					// 실제로는 i++ 되어 다음 루프때는 i = length가 되어 돌지 않고 종료됨.
					else if(k == myStr.length()-1) {
						list.add(myStr.substring(index1));
						i = k;
					}
				}
			}
		}

		// 리스트에 아무것도 없다 -> 모두 구분자 단어로 이루어짐
		if (list.size() == 0)
			return new String[] {"EMPTY"};

		// 리스트에 있다면 배열로 변환하여 리턴
		return list.toArray(new String[0]);
	}
}
  • 글자수 제한으로 아래 내용 캡처
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글