#1152

문제를 푸는데 의아한 점이 있어서 기록을 위해 작성.

Help

공백을 기준으로 단어 갯수를 세기 위해 아래와 같이 작성하였다.

#include <iostream>
#include <string>
 
int main()
{
    std::string input;
    
    std::getline(std::cin, input);
    
    int count = 0;
    int i = 0;
    while(true) {
        if(input[i] == '\n') break;
        if(input[i] == ' ') {
            std::cout << input[i] << std::endl;
            ++count;
            if (i == 0) count = 0;
        }
        ++i;
    }
    std::cout << count << std::endl;
 
    return 0;
}

중간에 디버깅을 위해 현재 공백을 출력하도록 하였고, 마지막에 count변수가 제대로 잘 나온다.

Bug

#include <iostream>
#include <string>
 
int main()
{
    std::string input;
        
    std::getline(std::cin, input);
    
    int count = 0;
	int i = 0;
	while(true) {
        if(input[i] == '\n') break;
        if(input[i] == ' ') {
            // std::cout << input[i] << std::endl;
            ++count;
            if (i == 0) count = 0;
        }
        ++i;
    }
    std::cout << count << std::endl;
 
    return 0;
}

문제는 위와 같이 while 안에 있는 출력문을 없애면, 에러가 나타난다. 원인은 std::getline()을 통해 얻은 string은 마지막에 개행을 포함하지 않기 때문에 while문이 정상적으로 종료되지 않는 것이 문제였다. 그 사이에 std::cout이 있을 때 정상적으로 종료되는 이유는 잘 모르겠다…

결국 C++의 std::string 문서를 참고하여 아래와 같이 수정하였다.

Check

#include <iostream>
#include <string>
 
int main()
{
    std::string input;
    
    std::getline(std::cin, input);
    
    int count = 0;
    int i = 0;
    for(int i=0; i<input.length(); ++i) {
        if(input[i] == ' ') {
            ++count;
            if (i == 0) count = 0;
        }
    }
    if(input[input.size() - 1] != ' ') ++count;
    std::cout << count << std::endl;
 
    return 0;
}

우선 정상적으로 반복문이 종료되도록 하고, 마지막에 공백이 없는 경우에는 count를 증가시키지 못하고 종료되므로 마지막 문자열이 공백이 아닌 경우에만 단어 갯수 count를 증가시키도록 하였다.

#1157

제출한 소스코드

#include <iostream>
#include <string>
#include <array>
#include <algorithm>
 
int main()
{
    std::array<int, 26> alphabet = {0}; // A to Z
    int index; // index of alphabet
    
    std::string input;
    char c; // input elements
    std::getline(std::cin, input);
    
    // Store the number of lower case alphabet
    for(size_t i=0; i<input.length(); ++i) {
        c = (char) tolower(input[i]);
        index = c - 'a';
        ++alphabet[index];
    }
    
    int max = -1;
    int where_max;
    // Find the most frequently used alphabet character
    for(size_t j=0; j<alphabet.size(); ++j) {
        if(alphabet[j] > max) {
            max = alphabet[j];
            where_max = j;
        }
    }
    std::sort(alphabet.begin(), alphabet.end(), std::greater<int>());
    if(alphabet[0] == alphabet[1]) std::cout << "?" << std::endl;
    else std::cout << (char) toupper(where_max + 'a') << std::endl;
 
 
    return 0;
}

도움을 얻은 자료들