안녕하세요
백준 알고리즘 단계별로 풀어보기 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번 문제 : 평균
'알고리즘 > 알고리즘JAVA' 카테고리의 다른 글
[백준알고리즘/함수] 15596번 문제 : 정수 N개의 합(자바/JAVA) (0) | 2021.05.08 |
---|---|
[백준알고리즘/1차원 배열] 4344번 문제 : 평균은 넘겠지(자바/JAVA) (0) | 2021.05.07 |
[백준알고리즘/1차원 배열] 1546번 문제 : 평균 (0) | 2021.05.05 |
[백준알고리즘/1차원 배열] 3052번 문제 : 나머지(자바/JAVA) (0) | 2021.05.04 |
[백준알고리즘/1차원 배열] 2477번 문제 : 숫자의 개수(자바/JAVA) (0) | 2021.05.03 |