본문 바로가기

별걸다하는 IT/알고리즘 문제풀이

[ACM ICPC 2005 기출, 백준 8958번] OX퀴즈 알고리즘 문제 및 해설 (난이도: 하 문제)

출처:

백준 알고리즘

ACM- ICPC 2005년 서울 regional 기출

문제 분류: 1차원 배열 사용하기

 

ACM-ICPC에서는 아래와 같이 영어로 출체되었습니다.

백준 알고리즘 사이트에 가면 이를 한국어로 번역해놓았습니다.

고럼 문제를 풀러 가볼까요?ㅎㅎ

 

 

정답률: 56.5%

난이도: 하

[8958번] OX 퀴즈

문제

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

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

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

입출력

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

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

 

 

 

같이 풀어봐요~! 정답을 보실 분은 밑으로 스크롤을 내려주세요~!

 

 

ANSWER

[OX 퀴즈 - Java]

난이도가 쉬운 문제예요. ㅎㅎ 문자열을 받아서 O이면 수를 계속 증가시켜주고 O가 아니면 다시 초기화해준 뒤 다음에 O가 나왔을 때 1 부터 더해질 수 있게 해주면 됩니다.

난이도가 어렵지 않은 만큼 바로 풀이로 갈게요!

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main{	
	public static int count;
	public static int sum;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int test_case = Integer.parseInt(br.readLine()); 
		for (int T = test_case; T > 0; T--)
		{
			count=0; sum=0;
	    	String inputLine = br.readLine();
	    	for(int i=0; i<inputLine.length(); i++) {
	    		if(inputLine.charAt(i) == 'O') {
	    			count++;
	    		}else {
	    			count=0;
	    		}
	    		sum+=count;
	    	}
	    	System.out.println(sum);
		}
		br.close();
    } 
}

메모리: 13044KB

시간: 84ms

코드 길이: 677B

 

딱히 설명할 만한게 없어서 다른 풀이로 나올 수 있는 부문을 생각해보자면..?

문자열 특정 위치의 문자 추출을 살펴볼게요.

위 코드처럼 charAt() 메서드를 사용해서 문자열 특정 인덱스에 있는 문자를 불러올 수도 있고

char[] str = br.readLine().toCharArray();

배열로 변환시켜서 우리가 익숙한 str[index]이런 형태로 문자를 비교할 수 있어요

 

 

[OX 퀴즈 - C++]

C++코드로 가봅시다! 위의 test_case반복문은 하나씩 감소함으로써 돌렸다면 이번에는 증가로 돌리기! (고게 그거지만..ㅎ)

#include <iostream>
#include <string>
using namespace std;
int main() {	
	int test_case;
	cin >> test_case; 	cin.ignore();
	int sum, count; string str;
	for (int i = 0; i < test_case; i++)
	{
		sum = 0; count = 0;
		getline(cin, str);
		for (int index = 0; index < str.length(); index++) {
			if (str[index] == 'O') {
				sum += (++count);
			}
			else {
				count = 0;
			}
		}
		cout << sum<<"\n";
	}
	return 0;
}

getline을 이용해서 한 줄을 읽어들였어요

여기서 주의해야 할 점이 있다면 cin과 getline을 함께 사용할 때는 버퍼를 꼭 비워줘야한다는 것?

자세한 것은 getline과 cin을 자세하게 비교해놓은 아래 포스팅을 참조합시다!

▼C언어 istream::getline()과 C++ string의 getline()! 한 줄 읽는 함수가 두 개?

 

C언어 istream::getline()과 C++ string의 getline()! 한 줄 읽는 함수가 두 개?

[C언어, C++언어, JAVA언어 포스팅 링크, 라이브러리 함수 모음 링크] [C/C++] 포스팅에 들어가기 전 cstring vs string.h vs string 스트링클래스 차이(C-strings vs std::string) 이 포스팅을 먼저 읽고 보길 권..

jhnyang.tistory.com

[OX 퀴즈 C언어 - scanf로 받기!]

문자열이 최대 80이라는 조건이 있으므로 C타입의 문자열로 풀어볼 수도 있겠죠?

보통 마지막에 오는 '\0'이랑 개행 때문에 문자 길이에 딱 맞춰서 문자열 공간을 생성하기보다는 +2 크기로 생성하는 습관을 들이는 것이 좋습니다.

#include <stdio.h>
int main() {
    char str[82];  int test_case;
    scanf("%d",&test_case);
    while(test_case--) {
        scanf("%s",str); //string입력받기
        int sum=0;
        for(int i=0, count=0; str[i]; i++) {
            if(str[i]=='O') count++;
            else count=0; //X가 나올 경우
            sum+=count;
        }
        printf("%d\n",sum);
    }
    return 0;
}

메모리: 1116KB

시간: 0ms

코드 길이: 411B

 

[OX 퀴즈 C언어 - fgets로 받기!]

이번에는 fgets로 문자열을 받아봤어요 ㅎㅎ

그리고 차이점은 조금이라도 코드를 달리 하기 위해 버퍼비우는걸 cin.ignore()이 아닌 getchar()를 사용해봤다는 정도?

#include<stdio.h>
int main() {	
	int test_case;
	scanf("%d", &test_case); getchar();
	int sum; char str[82];
	for (int i = 0; i < test_case; i++)
	{
		sum = 0;
		fgets(str, 82, stdin); 
		for (int i = 0, count = 0; str[i]; i++) {
			if (str[i] == 'O') count++;
			else count = 0; //X가 나올 경우
			sum += count;
		}
		printf("%d\n", sum);
	}
	return 0;
}

여러분은 어떤 방법으로 풀으셨나요?ㅎㅎ 색다른 풀이나 더 좋은 풀이가 있다면 알려주세요 ㅎㅎ

제 정답은 하나의 풀이일뿐 차선책은 아니랍니다! 오늘 풀이는 여기까지입니다! ㅎㅎ 공감댓글은 사랑입니다