loading

알고리즘/알고리즘JAVA

[백준알고리즘/1차원 배열] 8958번 문제 : OX퀴즈(자바/JAVA)

침착곰 2021. 5. 6. 11:30
반응형

안녕하세요

백준 알고리즘 단계별로 풀어보기 5단계 OX퀴즈를 풀어봤습니다

이번 문제도 1차원 배열과 반복문을 응용하면 어렵지 않게 풀 수 있습니다

약간 다르게 생각하면 1차원 배열을 안 써도 충분히 풀 수 있는 문제입니다

제가 푼 방식에 대해서 알아보겠습니다


문제

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

 

출력

각 테스트 케이스마다 점수를 출력한다.

 

 


문제 풀이

첫 번째 방법은 OX의 입력한 값을 배열 변수에 넣어서 구했습니다

중간에 OX를 푸는 과정은 substring을 사용해서 풀었습니다

상세한 설명은 주석에 달았습니다

처음 풀은 방식이라 어느정도 매끄럽게 풀지 못 한 느낌입니다

하지만 시간은 준수하게 나왔습니다 

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

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 및 OX를 반복할 변수 선언
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		int N = Integer.parseInt(br.readLine());
		
		// OX를 입력할 배열 선언
		String[] strArray = new String[N];
		
		// 반복문을 사용하여 OX를 배열에 입력
		for(int i = 0; i < N; i++)
		{
			strArray[i] = br.readLine();
		}
		
		// OX를 계산한 값을 넣을 변수 선언
		int sum;
		int count;
		
		// 반복문을 사용하여 OX에 대한 값을 계산
		for(int i = 0; i < strArray.length; i++)
		{
			// sum, count 0으로 초기화
			sum = 0;
			count = 0;
			
			// 문자열 길이만큼 반복
			for(int j = 0; j < strArray[i].length(); j++)
			{
				// O인 경우 count + 1, sum += count
				if(strArray[i].substring(j, j+1).equals("O"))
				{
					count++;
					sum += count;
				}
				// X인 경우 count = 0
				else 
				{
					count = 0;
				}
			}
			
			// 결과 출력
			System.out.println(sum);
		}
	}
}

 


두 번째 방식입니다

이번에는 결과값을 배열로 빼서 구현한 방식입니다

OX는 String 변수에 입력하고 결과를 바로바로 배열에 입력해줬습니다

위에서는 substring을 사용해서 OX를 계산했는데 charAt을 사용해서 계산합니다

위에 풀때는 charAt이 생각이 안 났어요 ㅠㅜ

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

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 및 OX를 반복할 변수 선언
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		int N = Integer.parseInt(br.readLine());
		
		// 결과를 넣을 배열 선언
		int[] Output = new int[N];
		
		// 반복문 실행
		for(int i = 0; i < N; i++)
		{			
			// OX를 계산한 값을 넣을 변수 선언
			int sum = 0;
			int count = 0;

			// OX 입력
			String strArray = br.readLine();

			// 문자열 길이만큼 반복
			for(int j = 0; j < strArray.length(); j++)
			{
				// O인 경우 count + 1, sum += count
				if(strArray.charAt(j) == 'O')
				{
					count++;
					sum += count;
				}
				// X인 경우 count = 0
				else 
				{
					count = 0;					
				}
			}

			// 결과를 배열에 입력
			Output[i] = sum;
		}
		
		// 배열에 입력된 결과 출력
		for(int i = 0; i < N; i++)
		{			
			System.out.println(Output[i]);
		}
	}
}

 


세 번째 방식입니다

배열을 사용하지 않고 구현한 방식입니다

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

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 및 OX를 반복할 변수 선언
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		int N = Integer.parseInt(br.readLine());
		
		// 결과 출력 데이터, OX를 계산한 값을 넣을 변수 선언
		StringBuilder sb = new StringBuilder();
		int sum;
		int count;
		
		// OX 데이터를 입력할 변수
		String strArray;
		
		// N만큼 반복
		for(int i = 0; i < N; i++)
		{			
			// sum, count 0으로 초기화
			sum = 0;
			count = 0;
			
			// OX 데이터 입력
			strArray = br.readLine();

			// 문자열 길이만큼 반복
			for(int j = 0; j < strArray.length(); j++)
			{
				// O인 경우 count + 1, sum += count
				if(strArray.charAt(j) == 'O')
				{
					count++;
					sum += count;
				}
				// X인 경우 count = 0
				else 
				{
					count = 0;					
				}
			}
			
			// 결과 입력
			sb.append(sum + "\n");
		}

		// 결과를 배열에 입력
		System.out.println(sb);
	}
}

 

여기까지 제가 풀은 세 가지 방식이었습니다

이제 시간을 비교해보겠습니다!!

 


속도 비교

1번 : OX 입력시 배열 사용

2번 : OX 결과 입력시 배열 사용

3번 : 배열사용X

 

음... 제 생각과는 결과가 좀 많이 다르게 나왔습니다

저는 3번이 제일 빠를 줄 알았는데 생각보다 시간이 많이 나왔네요;;

메모리 사용량은 1번이 제일 적었습니다

하지만 시간은 2번이 제일 빠르네요

나중에 소스를 천천히 분석해봐야할 것 같아요

이상 알고리즘 8958번 OX퀴즈를 풀은 내용이었습니다

이 글이 알고리즘을 공부하는 분들께 도움이 되었으면 좋겠습니다!

 

다음 문제 : 2021.05.07 - [알고리즘/알고리즘JAVA] - [백준알고리즘/1차원 배열] 4344번 문제 : 평균은 넘겠지(자바/JAVA)

이전 문제 : 2021.05.05 - [알고리즘/알고리즘JAVA] - [백준알고리즘/1차원 배열] 1546번 문제 : 평균

반응형
그리드형