티스토리 뷰
개발/알고리즘
[Codility] Find the Longest Substring without Repeating Characters Three Times in a Row
최컬리 2019. 10. 5. 22:33 '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;
}
}
'개발 > 알고리즘' 카테고리의 다른 글
[프로그래머스] 오른쪽에서 왼쪽으로 n회 접은 종이의 상태 나타내기 (0) | 2019.10.28 |
---|---|
[구름] 사탕 받기 카드 게임 (0) | 2019.09.29 |
삼항연산자, 비교연산자, Math.max()를 이용한 최대값 구하기 비교 (0) | 2019.09.28 |
[백준] 회전하는 큐(1021) (0) | 2019.09.27 |
[구름] 전광판 광고 (0) | 2019.09.24 |
댓글