본문 바로가기

온라인 코딩/기타(Other)

[백준] 17389번 보너스 점수

 

 

문제

소스코드

#include<iostream>
#include<string>
#include<algorithm>
#include<string_view>

constexpr int MAX_N				= 10001;
std::string_view RIGHT_ANSWER	= "O";
std::string_view WRONG_ANWER	= "X";

int main() {
	int bonus_score{};
	int total_score{};
	int N{};
	std::string S;

	std::cin >> N;
	std::cin >> S;

	for (int i = 0; i < S.size(); ++i)
		S[i] = std::toupper(S[i]);

	for (int i = 0; i < N; ++i) {

		if (S[i] == *(RIGHT_ANSWER.data())) {
			total_score += (i + 1) + bonus_score++;
		}
		else
			bonus_score = 0;
	}
	std::cout << total_score << "\n";
}

 

후기

이 문제를 풀기 위해서는 두 가지의 문제를 해결해야 한다.

 

1.  소문자와 대문자를 구별해야 한다.

      소문자 o와 대문자 O를 구별하기 위해 std::toupper() 메서드를 사용하였다. 

 

2. 해당 String에 들어있는 값을 읽어서 점수를 매겨야 한다.

      *std::string_view 자료구조를 사용해서 인덱스를 하나씩 검사해서 O(대문자 O)이면 점수를 더하게 하였다.

 

정답 비율에 알 수 있듯이 그렇게 어려운 문제는 아니다. 정말 문제 이름 그대로 보너스 느낌의 문제이다. 

std::string_view에 적응하기 위해 사용할 수 있을 거 같은 문제이면 사용해서 쓰고 있다. 최신 표준의 자료구조를 배우고 그걸 쓰기 위한 노력도 중요하다고 생각한다.

 

* std::string_view는 C++17 표준 자료구조 이기 때문에 해당 코드는 C++17 이상을 지원하는 컴파일러에만 작동합니다.

 

출처 및 레퍼런스

문제 링크:https://www.acmicpc.net/problem/17389