티스토리 뷰

 'a'와 'b'로만 이루어진 문자열에서 같은 문자가 세 번 연속하는 경우를 포함하지 않는 substring 중 가장 긴 것의 길이를 구하는 문제이다. 이전 문자를 기억하기 위한 char형 변수와 연속한 문자가 이전 문자와 동일한지 여부를 체크하는 boolean 값을 이용해서 문자열의 현재 인덱스에서 같은 문자가 세 번 연속 등장했는지 검사한다.

 분기문을 설명하자면, 현재 확인하고 있는 위치의 문자가 이전 문자와 같은 경우는 두 가지 경우로 나눌 수 있다. 같은 문자가 두 번째 등장한 경우와 세 번 이상 등장한 경우이다. 두 번째 등장했다면 identical의 값을 true로 변경하고 세 번째 등장할 경우를 대비한다. 그러고 나서 등장하는 문자가 이전과 다르다면 identical의 값을 false로 되돌리고 카운팅을 계속 하지만, 같다면 카운팅을 마치고 현재까지 나온 가장 긴 길이와 비교한다. 그리고 동일한 문자로 이루어진 문자열 중 유효한 뒤에 두 문자부터 다시 카운팅을 시작하며, 또다시 같은 문자가 나올 경우에는 같은 방법으로 길이 값을 2로 초기화하고 뒤에 두 개의 문자부터 다시 세기 시작한다.

public class Main {
	public static void main(String[] args) {
//		String S = "baaabbabbb";
//		String S = "babba";
//		String S = "abaaaa";
		String S = "aaaaaa";
		
		System.out.println(solution(S));
	}
	
	public static int solution(String S) {
		int longest = 1;
		int len = 1;
		char previous = S.charAt(0);
		boolean identical = false;
		
		for (int i = 1; i < S.length(); i++) {
			if(S.charAt(i) == previous) {
				if(!identical) {
					identical = true;
					len++;
				} else {
					longest = (len > longest) ? len : longest;
					len = 2;
					continue;
				}
			} else {
				previous = S.charAt(i);
				identical = false;
				len++;
			}
		}
		
		longest = (len > longest) ? len : longest;
		
		return longest;
	}
}
댓글