백준 Hissing Microphone

KIMYEONGJUN·6일 전
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

The input contains a single string on a single line.
This string consists of only lowercase letters (no spaces) and has between 1 and 30 characters.

Output a single line.
If the input string contains two consecutive occurrences of the letter s, then output hiss.
Otherwise, output no hiss.

내가 이 문제를 보고 생각해본 부분

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));:
BufferedReader 객체를 생성하여 시스템으로부터 입력을 받도록 준비한다. 
System.in은 표준 입력 스트림을 의미한다.
String s = br.readLine();:
사용자가 입력한 한 줄의 문자열을 읽어서 s라는 String 변수에 저장한다. 
이 변수가 우리가 's's' 패턴을 검사할 대상 문자열이다.
boolean foundHiss = false;:
ss 패턴이 발견되었는지 여부를 추적하는 boolean 변수이다. 
초기값은 false로 설정하여 아직 발견되지 않았음을 나타낸다.
for (int i = 0; i < s.length() - 1; i++) { ... }:
여기서 핵심적인 검사 로직이 진행된다. 
for 루프를 사용하여 문자열 s의 각 문자를 순회한다.
반복문 조건 i < s.length() - 1이 중요하다.
문자열 s의 길이가 N이라면, 인덱스는 0부터 N-1까지이다.
s.charAt(i)와 s.charAt(i + 1)을 비교해야 하므로, i가 N-1이 되면 i + 1은 N이 되어 IndexOutOfBoundsException이 발생한다.
따라서 i는 최대 N-2까지 가야 안전하게 N-1 인덱스에 접근할 수 있다. 
그래서 s.length() - 1 미만까지 (즉, s.length() - 2까지) 반복한다.
if (s.charAt(i) == 's' && s.charAt(i + 1) == 's') { ... }:
루프 안에서 s의 i번째 문자가 's'이고, 동시에 i+1번째 문자도 's'인지 확인한다.
foundHiss = true; break;:
만약 두 연속된 's'를 찾았다면, foundHiss 변수를 true로 설정한다.
더 이상 문자열을 확인할 필요가 없으므로 break 문을 사용하여 for 루프를 즉시 종료한다.
if (foundHiss) { System.out.println("hiss"); } else { System.out.println("no hiss"); }:
for 루프가 끝난 후, foundHiss의 값을 확인한다.
true라면 ss 패턴이 발견된 것이므로 "hiss"를 출력한다.
false라면 ss 패턴이 발견되지 않은 것이므로 "no hiss"를 출력한다.
br.close();:
BufferedReader를 사용한 후에는 자원 누수를 방지하기 위해 반드시 close() 메소드를 호출하여 닫아주어야 한다.

코드로 구현

package baekjoon.baekjoon_32;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 백준 15272번 문제
public class Main1268 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();

        boolean foundHiss = false; // "ss"를 찾았는지 여부를 저장할 변수

        // 문자열을 순회하며 's' 문자가 두 번 연속으로 나오는지 확인합니다.
        // s.length() - 1까지 순회하는 이유는 s.charAt(i + 1)을 사용하기 위함입니다.
        // 예를 들어 문자열 길이가 5라면, i는 0, 1, 2, 3까지 순회해야 합니다.
        // i가 3일 때, s.charAt(3)과 s.charAt(4)를 비교합니다.
        for (int i = 0; i < s.length() - 1; i++) {
            // 현재 문자와 다음 문자가 모두 's'인 경우
            if (s.charAt(i) == 's' && s.charAt(i + 1) == 's') {
                foundHiss = true; // "ss"를 찾았음을 표시합니다.
                break; // 더 이상 찾을 필요 없으니 반복문을 종료합니다.
            }
        }

        if (foundHiss) {
            System.out.println("hiss");
        } else { // foundHiss가 false인 경우
            System.out.println("no hiss");
        }

        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글