[JAVA][정올 2514] 문자열 찾기
- 알고리즘
- 2021. 1. 20.
SHORTCUT
반응형
사이트명 | 정올 |
문제 링크 | jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1775&sca=2050 |
주요 알고리즘 | #문자열탐색 |
사용 언어 | Java 자바 |
설명이 장황합니다.. 도움되는 것만 파악하세요 :-) |
1. 문제
2. 입력 / 출력
3. 풀이
3-1. 생각 노트
타겟이 되는 문자열을 char[] 배열에 넣고, 그 갯수만큼 추가로 for문을 돌면서 맞는지 체크한다!
여기선 KOI, IOI 둘다 O I 여서 그냥 target 배열 하나만 만들어서 2회만 돌렸다.
다만, 맞을 때마다 i 값을 증가시키고, 아니라면 temp에 저장한 인덱스 값으로 원상복귀 시킨다!
그리고, 문자열이 맞다면 i 값을 하나 줄여서 다시 그 자리부터 체크하도록 한다.
다만, 마지막 문자가 I 혹은 K라면 if문 안에 [++i] 로 아웃오브인덱스 에러가 발생하므로
배열 크기보다 크다면 끝내도록 지정한다.
3-2. 변수명
변수명 | 설명 |
char[] target | 비교하려는 타겟 문자열을 두어서 for문으로 순차적으로 비교하게 둔다 |
3-3. 코드 보기
/**************************************************************
Problem: 2514
Language: Java
Result: Success
Time:355 ms
Memory:17416 kb
****************************************************************/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[] input = sc.nextLine().toCharArray();
/*
* 풀이 순서 1. 모두 다 배열에 넣기 2. 앞에부터 가면서, K 혹은 I로 시작하는지 확인하기 3. 둘 중 조건에 만족했다면, 재귀를
* 태워서 연속 세개인지 확인하기 4. 연속 세개가 맞다면 해당 숫자만큼 i 값을 더해서 앞으로 전진시키기
*
*/
char[] target = { 'O', 'I' };
int cntKOI = 0;
int cntIOI = 0;
here: for (int i = 0; i < input.length; i++) {
int temp = i;
if(i >= input.length-1) break;
if (input[i] == 'K') {
for (int j = 0; j < 2; j++) {
if (input[++i] != target[j]) {
i = temp;
continue here;
}
}
cntKOI++;
i--;
} else if (input[i] == 'I') {
for (int j = 0; j < 2; j++) {
if (input[++i] != target[j]) {
i = temp;
continue here;
}
}
cntIOI++;
i--;
}
}
System.out.println(cntKOI);
System.out.println(cntIOI);
}
}
3-4. 마무리
이런 류의 다중 for문은 꼭 레이블(here)을 붙여서 제어하곤 한다..
이렇게 해도 괜찮겠지?
반응형