반응형

 

 

 

 

 

 

5

OOXXOXXOOO

OOXXOOXXOO

OXOXOXOXOXOXOX

OOOOOOOOOO

OOOOXOOOOXOOOOX

 

 

입력의 형태는 크게 횟수와 문자열의 모음으로 문자열 벡터를 생성해서 5번 반복해서 생성한 벡터에 차례대로 입력함

이중 for문을 사용해서 벡터 값에 있는 문자열을 하나씩 꺼내서

문자열 인덱스로 접근 후 각 값이 O인지 X인지 확인 후 점수체계를 만들어줌

 

 

str O O X X O X X O O O
ans 1 2 0 0 1 0 0 1 2 3

 

위의 표를 참고해서 보면 연속되어 퀴즈를 맞힌 OO, OOO의 경우 얻을수있는 점수는 1점이 3개가 아니라

연달아 맞힘으로 인해 점수가 연속해서 맞힌 갯수만큼 증가하게된다

따라서 OO = 3점, OOO = 6점임을 알수있음

 

나는 총점과 str[j]에 해당하는 점수를 각각의 변수로 따로 선언해서 과거 문제를 맞춘 이력을 기억하도록 했다

ex) O : score++;

X : score=0;

 

연속해서 맞히다가 틀릴 경우 연속했던걸 기억해둘필요 없으므로 score를 0으로 리셋해준다

 

 

 

#include<bits/stdc++.h>
using namespace std;

int main() {
	int ans;
	int score;
	
	vector<string> v;
	string str="";
	
	int cnt;
	cin >> cnt;
	
	for(int i=0; i<cnt; i++){
		cin >> str;
		v.push_back(str);
	}
	
	for(int i=0; i<cnt; i++){
		ans=0;
		score=0;
		str = v[i];
		
		for(int j=0; j<str.length(); j++){
			if(str[j] == 'O'){
				score++;
				ans+=score;
			}
			else {
				score=0;
			}
		}
		cout<<ans<<"\n";
	}

	return 0;
}

시간 0ms

 

 

 

좀더 줄여본 방법

벡터에 따로 저장 안하고 입력과 동시에 입력받은 문자열 판별해서 점수출력하기

 

#include<bits/stdc++.h>
using namespace std;

int main() {
	int ans;
	int score;
	
	string str="";
	
	int cnt;
	cin >> cnt;
	
	for(int i=0; i<cnt; i++){
		cin >> str;
		
		ans=0;
		score=0;
		
		for(int j=0; j<str.length(); j++){
			if(str[j] == 'O'){
				score++;
				ans+=score;
			}
			else {
				score=0;
			}
		}
		cout<<ans<<"\n";
		str="";
	}

	return 0;
}

시간 4ms

코드 길이랑 메모리는 조금 줄었고 시간은 비슷하거나 미세하게 차이가 있는듯

 

 

 

 

 

출처 : www.acmicpc.net/problem/8958

 

8958번: OX퀴즈

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

www.acmicpc.net

 

반응형

+ Recent posts