SKSDUD

[Java]백준 - OX퀴즈(8958번) 본문

프로그래밍/백준

[Java]백준 - OX퀴즈(8958번)

NYinJP 2023. 2. 8. 16:27

주관적으로 평가하자면 어려웠다. 근데 누군가는 아주 간단한 문제다! 라고 포스팅을 하였다. 내 지능이 의심스럽다. 

머... 코딩 못하는 거 몰랐던것도 아니고 논리를 이해하지 못하는걸까? 다시 한번 살펴보자. 

 

Error 01 : 개행문자 문제

    public static void main(String[] args){
    
        Scanner sc= new Scanner(System.in);
        int n=sc.nextInt();
        String [] strOX=new String [n];
        
        for(int i=0;i<n;i++){
            strOX[i]=sc.nextLine();
        }
        sc.close(); // 입출력이 끝나면 sc.close()

nextLine으로 문자열을 입력받으면 안된다.

테스트케이스의 수를 읽을 때 썼던 nextInt()는 정수'만' 읽어온다. 마지막 개행문자를 제거하지 않는다. 

정수 뒤에 있는 개행문자를 읽지 않고 남겨두기 때문에

nextLine()으로 문자열을 입력받을 때는 남겨졌던 개행문자를 하나 읽고 한 줄이 끝난것으로 본다. 공백이 저장되는 것.

따라서 값을 제대로 읽어오지 못한다.

 

nextLine()이 아니라 next()로 읽어와야한다.

 

next()
- 공백을 기준으로 한 단어 또는 한 문자씩 입력받는다.
- 버퍼에 입력된 문자나 문자열에서 공백 전까지의 단어를 읽음. 그래서 개행 문자를 가져오지 않는다.

nextLine()
- 문자 또는 문장 한 라인 전체를 입력받는다.
- 버퍼에 입력된 문자열을 개행 문자까지 다 가져온다.

 

strOX[0], strOX[3을 출력한 모습

오른쪽은 보다시피 4개의 OX 문자열을 입력받아야 했지만 개행문자까지 포함되어 "OOOOOOO"까지만 받고 종료하였다. 또 왼쪽은 0번째가 개행문자가 저장되어 (아무것도 보이지 않지만) 출력되었다. 

 

개행문자를 처리하는 다른 다양한 방법이 있지만 여기서는 next()로 문자열을 받아옴으로써 해결하였다. 

 

Error 02 : 초기화

내 지능이 의심되었던 부분이다. 

초기화가 필요했다는 건 알았다.

근데 그 위치가 어디인지 고민을 했다.

대체 왜일까???

 

for문에 대한 이해가 부족해서 그런게 아닐까 싶다.

 

하나의 문자열에 대한 처리가 끝나고

다음 문자열에 대하여 접근할 때 

초기화를 해줘야 한다.

그래야 이전에 계산했던 count나 sum값이 누적되지 않는다. 

 

Code

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner sc= new Scanner(System.in);
        int n=sc.nextInt();
        String [] strOX=new String [n];
        for(int i=0;i<n;i++){
            strOX[i]=sc.next();
        }
        sc.close(); // 입출력이 끝나면 sc.close()

        for(int i=0;i<strOX.length;i++){

            int count=0;
            int sum=0;

            for(int j=0;j<strOX[i].length();j++){ // 문자열 요소 하나씩 접근

                if(strOX[i].charAt(j)=='O'){ // O라면
                    count+=1;
                }else{ // X 라면
                    //카운트 초기화
                    count=0;
                    continue;
                }
                sum+=count;
            }
            System.out.println(sum);
        }
    }
}

배열에 저장된 문자열에 하나씩 접근합니다.

  count를 초기화합니다.

  sum을 초기화합니다. 

  문자열에 저장된 문자에 하나씩 접근합니다.

     만약 문자가 O라면

        count+=1;

      만약 문자가 X라면

         count=0;

         continue;

        문자가 끝날때마다 sum에 count값 추가 (1+2+3...)

    합을 출력합니다.