
문제
재형이는 인생 역전을 위해 오늘도 로또를 샀다. 로또를 구매하면 알파벳 대문자 N개가 일렬로 적힌 문자열이 주어진다.
로또에 당첨되기 위해선 인접한 문자가 모두 사전상에서 이웃한, 길이 5 이상의 부분 문자열이 로또 문자열에 존재해야 한다.
예를 들어 'C'와 사전상에서 이웃한 문자는 'B'와 'D'이고, 'Z'와 이웃한 문자는 'Y' 하나이며, 자기 자신과는 이웃하지 않는다.
따라서, 로또 문자열이 "ABCDE", "ASGXYZYXE", "WEFGHIJKA"인 경우는 당첨이고, "ABCDF", "CXYZAB", "AAAAA"는 당첨되지 않은 경우이다.
알파벳 대문자 N개로 이루어진 문자열이 주어질 때, 로또에 당첨되었는지를 구해보자.
입력
첫째 줄에 로또 문자열의 길이 N(5≤N≤100000)이 주어진다.
둘째 줄에 로또 문자열 S가 주어진다.
출력
로또에 당첨된 경우라면 YES를, 아니면 NO를 출력한다.
https://www.acmicpc.net/problem/25183
25183번: 인생은 한 방
첫째 줄에 로또 문자열의 길이 $N(5 \leq N \leq 100\,000)$이 주어진다. 둘째 줄에 로또 문자열 $S$가 주어진다.
www.acmicpc.net
접근
5개의 연속된 문자열을 찾으면 되는 간단한 문제입니다.
(char 형의 현재 문자 - char 형의 이전 문자) 값이 +1 또는 -1 이 나온다면 연속된 문자열 입니다.
index 1번부터 문자열 길이-1까지 탐색하여
연속된 알파벳이 5번 나오면 YES를 출력하고
모든 탐색이 종료되어도 5번이 나오지 않는다면 NO를 출력합니다.
구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static boolean isLottoWinner(int n, String s) {
int count = 1;
for(int i=1;i<n;i++) {
char c = s.charAt(i);
char before = s.charAt(i-1);
if(c-before==1||before-c==1) {
count++;
if(count==5) return true;
}else {
count=1;
}
}
return false;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String s = br.readLine();
System.out.println(isLottoWinner(n, s)?"YES":"NO");
br.close();
}
}
'알고리즘' 카테고리의 다른 글
[백준] 28432번: 끝말잇기 JAVA (0) | 2023.08.11 |
---|---|
[레이튼 미스터리저니] 이쪽저쪽 프루트 (0) | 2023.07.30 |
[백준] 24416번: 알고리즘 수업 - 피보나치 수 1 Java (0) | 2022.06.04 |
[백준] 16139번: 인간-컴퓨터 상호작용 Java (0) | 2022.06.03 |
[백준] 2559번: 수열 Java (0) | 2022.05.31 |
댓글