
내가 생각했을때 문제에서 원하는부분
첫째 줄에 문자열 S(3 ≤ S의 길이 ≤ 100)가 주어진다.
연속된 세 숫자가 등장한 횟수를 출력한다.
내가 이 문제를 보고 생각해본 부분
입력 처리 및 초기 설정:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); : 빠르고 효율적인 입력을 위해 BufferedReader를 사용한다.
사용자로부터 한 줄을 읽어올 준비를 한다.
String s = br.readLine(); : 문제에서 주어진 숫자 문자열 S를 읽어와 s 변수에 저장한다.
int cnt = 0; : 문제의 조건(연속된 세 숫자)을 만족하는 횟수를 세기 위한 변수입니다. 초기값은 0이다.
StringBuilder sb = new StringBuilder(); : 연속적으로 1씩 증가하는 숫자들을 임시로 담아두는 '바구니' 역할을 한다.
문자열을 효율적으로 조작하기 위해 StringBuilder를 사용한다.
sb.append(s.charAt(0)); : 문자열 s의 첫 번째 숫자(s[0])를 StringBuilder에 먼저 추가한다.
이는 반복문이 i=1부터 시작하므로, 첫 번째 숫자를 초기 기준으로 잡기 위함이다.
문자열 탐색 및 연속 숫자 덩어리 만들기:
for(int i = 1; i < s.length(); i++) : s 문자열의 두 번째 숫자(s[1])부터 마지막 숫자까지 반복하며 확인한다.
연속성 확인 (if ( (s.charAt(i-1) == s.charAt(i)-1) || sb.length()==0)):
s.charAt(i-1) == s.charAt(i)-1 : 현재 s.charAt(i) 문자가 바로 이전 문자 s.charAt(i-1)보다 정확히 1 큰 숫자인지 확인한다.
예를 들어, s[i-1]이 '2'이고 s[i]가 '3'이면 이 조건은 true가 된다. ('2' == '3'-1 이기 때문이다.)
sb.length() == 0 : 이 조건은 주로 이전의 연속이 끊어졌을 때, sb가 비어있으므로 새로운 연속을 시작할 때 현재 문자를 바구니에 담기 위해 사용된다.
두 조건 중 하나라도 만족하면, sb.append(s.charAt(i));를 통해 현재 문자를 sb에 추가하여 연속 덩어리를 이어간다.
연속이 끊어졌을 때 (else 블록):
만약 if 조건이 false가 되어 연속적인 오름차순이 끊기거나, 혹은 현재 문자가 이전 문자보다 1 큰 숫자가 아니라면 else 블록으로 진입한다.
if( sb.length() == 3 ) { cnt++; } : 여기에서 핵심 로직이 발동한다.
현재까지 모인 sb의 길이가 정확히 3인지 확인한다.
만약 sb에 "123", "567"과 같이 세 개의 오름차순 숫자가 담겨 있었다면, 이 조건을 만족하므로 cnt를 1 증가시킨다.
문제의 "네 숫자 이상이 연속일 경우에는 그 일부를 세지 않고"라는 조건은 여기서 sb.length()가 3보다 클 때 cnt를 증가시키지 않음으로써 처리된다. (예: 1234가 sb에 담겼다면 sb.length()는 4가 되므로 cnt는 증가하지 않는다.)
sb = new StringBuilder(); sb.append(s.charAt(i)); : 연속이 끊어졌으므로, sb를 초기화하고 현재 s.charAt(i) 문자를 새롭게 시작하는 연속 덩어리의 첫 문자로 다시 담아준다.
반복문 종료 후 처리:
for 루프가 모두 끝난 후에는 sb에 마지막으로 만들어진 연속 숫자 덩어리가 남아 있을 수 있다.
if( sb.length() == 3 ) { System.out.println(cnt+1); } : 만약 마지막 sb의 길이가 정확히 3이라면, 아직 cnt에 추가되지 않았으므로 cnt+1을 출력한다.
else { System.out.println(cnt); } : 마지막 sb의 길이가 3이 아니라면(3보다 작거나 크다면), 그대로 cnt 값을 출력한다.
자원 해제:
br.close(); : 사용이 완료된 BufferedReader를 닫아 시스템 자원을 해제한다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 17288번 문제
public class Main1248 {
public static void main(String[] args) throws IOException { // IOException 처리를 위해 throws 추가
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // BufferedReader 객체 생성
String s = br.readLine(); // br.readLine()으로 한 줄 전체를 읽음
int cnt = 0 ;
StringBuilder sb = new StringBuilder();
// 문제 조건 상 S의 길이는 3 이상이므로 s.charAt(0)은 항상 유효합니다.
sb.append(s.charAt(0));
for(int i = 1 ; i< s.length();i++) {
// 현재 문자가 이전 문자보다 1 큰 오름차순이거나,
// sb가 비어있어 새로운 연속을 시작하는 경우
if( (s.charAt(i-1) == s.charAt(i)-1) || sb.length()==0) {
sb.append(s.charAt(i));
} else { // 연속된 오름차순이 끊어진 경우
if( sb.length() == 3 ) { // 끊어진 연속된 숫자의 길이가 정확히 3이라면 카운트
cnt++;
}
// 연속이 끊겼으므로 StringBuilder를 초기화하고 현재 문자로 새로운 연속을 시작
sb = new StringBuilder();
sb.append(s.charAt(i));
}
}
// 반복문이 끝난 후, sb에 남아있는 마지막 연속된 숫자들을 확인
if( sb.length() == 3 ) { // 마지막으로 확인한 연속된 숫자가 정확히 3이라면 카운트에 추가
System.out.println(cnt+1);
} else { // 그 외의 경우 (3보다 작거나 3보다 큰 경우)
System.out.println(cnt);
}
br.close(); // BufferedReader 닫기 (자원 해제)
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.