Programming/알고리즘

[백준] 8958 - OX퀴즈 - JAVA[자바]

Gilbert_ 2022. 11. 27. 19:08

 

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

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int N = Integer.parseInt(br.readLine());       
        String arr[] = new String[N];
        
        
        for (int i = 0; i < N; i++){
            arr[i] = br.readLine();
        }
        
        for (int i = 0; i < N; i++){
            int series = 0;
            int score = 0;
            
            for(int j=0; j<arr[i].length(); j++){
                if(arr[i].charAt(j) == "O"){
                    series++;
                } else{
                    series = 0;
                }
                score += series;
            }
            System.out.println(score);
        }
        
    }
}

위의 코드는 arr[i].charAt(j) == "O" 의 따옴표를 ""쌍따옴표로 썼기때문에 에러가 난다.

'' 로 바꿔주는 것 잊지 말자

 

 

 

1. 먼저 String 배열 arr[] 의 각각의 원소에 문자열을 저장해준다.

 

그리고 series 는 몇 번 연속했는지,

score는 누적 합산 값을 나타내는 변수로 선언을 해준다.

 

그리고 그 안에 for문으로 한 원소당 String 의 길이만큼 반복하여 해당 원소의 문자열을 charAt() 메소드를 통해 하나하나 검사한다.

그 과정에서 만약 O 라는 문자가 나타나면 cnt 을 1 증가시키고 아닐경우는 X 문자이니 cnt 를 0 으로 초기화 시켜준다.

 

그렇게 하여 sum에 cnt 값을 누적하여 더해준 뒤 해당 배열 원소의 문자열을 다 검사하고나면 sum 을 출력해주면 된다.

 

 

 

 

 

배열을 사용하지 않는 방법

 

위에서는 String이라는 배열을 사용했지만, 

getBytes() 메소드for-each 문을 쓰면 매우 쉽고 간결한 코드가 될 수 있다.

 

 

getBytes() 메소드는 입력 문자열을 byte 단위의 배열로 반환시켜주는 메소드다.

그리고 '배열'로 반환을 하므로 for-each 문에서도 쓸 수 있다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
		StringBuilder sb = new StringBuilder();
 
		int N = Integer.parseInt(br.readLine()); // 테스트 케이스
 
		for (int i = 0; i < N; i++) {
 
			int series = 0; // 연속횟수
			int score = 0; // 누적 합산
 
			for (byte value : br.readLine().getBytes()) {
				
				if (value == 'O') {
					series++;
					score += series;
				} 
				else {
					series = 0;
				}
			}
			
			sb.append(score).append('\n');
 		}
		System.out.println(sb);
 
	}
}

for( byte value : br.readLine().getBytes() )  

=> for-each 구문으로, br.readLine()으로 한 줄의 문자열을 입력받는다.

.getBytes()는 입력받은 문자열을 byte형 배열로 반환한다.

 

즉, for-each문은 입력을 한 줄 받으면

"해당 문자열의 길이만큼 반복하면서 해당 문자열의 문자를 하나씩 value에 저장하여 꺼내온다."

 

 

1번째  : for-each + .getBytes() 이용 

2번째 : BufferedReader + StringBuilder 이용

3번째 : BufferedReader + println 이용.