본문 바로가기

공부기록/C, C++

[BOJ] 기타 입출력 문제 C++

저번주엔 입출력 문제 중 A+B 를 풀었고, 이번주엔 남은 입출력 문제들을 마저 해결했다.

 

11718번 그대로 출력하기

📝문제 링크 : https://acmicpc.net/problem/11718

#include <iostream>
#include <string>

int main(void)
{
    std::string s;
    while (1)
    {
        getline(std::cin, s);
        if (s == "")
                break;
        std::cout << s << std::endl;
    }
    return 0;
}

공백이 포함 될 수 있기 때문에 cin으로 해결할 수 없다.

<string>에 정의된 getline() 함수를 써야한다고 함.

  • getline 함수는 입력 스트림에서 문자들을 읽어서, 인자로 받은 문자열에 저장합니다.
  • std::istream&    getline(std::istream& input, std::string& str, char delim)
    • input : 문자들을 읽어들일 스트림
    • str : 입력받은 문자열을 저장할 문자열 변수
    • delim : 구분 문자. 이 문자가 나타나기 전까지 읽어들인다. (생략가능)
  • 한 가지 주의할 사항은, 입력 방식 중에 공백문자(delimiter)를 스트림에 남겨놓는 입력방식 뒤에 getline 을 바로 호출하게 된다면, getline 은 해당 공백문자를 읽고 바로 읽기를 종료하게 된다.
  • 문자열의 byte 크기를 리턴하는 <string>의 .size()를 이용해서 짠 코드도 있었다.
  • 제출하고 나서 맞은 사람들의 코드를 보니 <unistd>의 read()함수를 사용하기도 하고 각양각색이었다.

11719 그대로 출력하기 2

📝문제 링크 : https://acmicpc.net/problem/11719

#include <iostream>
#include <string>

int main()
{
	string s;
    
    while (getline(cin, s))
    	cout << s << '\n';
    
    return 0;
}
  • 입력으로 빈 줄이 주어질수도 있다는 점이 1번 문제와 다르다.

11720번 숫자의 합

📝문제 링크 : https://acmicpc.net/problem/11720 

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int		i, N, sum;
    string	s;

    sum = 0;
    cin >> N >> s;
    for (i = 0; i < N; i++)
    {
    	sum += s[i] - '0';
    }
    cout << sum << endl;
    
    return 0;
}

 

  •  처음에 시도했다가 실패한 방법
cin >> N;
getline(cin, s);

첫번재 문제에 써놨던 주의사항에 바로 걸렸다. cin은 개행을 스트림에 남겨놓는다.

한 가지 주의할 사항은, 입력 방식 중에 공백문자(delimiter)를 스트림에 남겨놓는 입력방식 뒤에 getline 을 바로 호출하게 된다면, getline 은 해당 공백문자를 읽고 바로 읽기를 종료하게 됩니다.

👆이럴 땐 cin.get() 이나 getchar()로 버퍼를 비우고 해도 된다.

하지만 cin >> N >> s; 이렇게 쓰는게 더 간편해보여서 이 방법을 썼다.


1924번 2007년

📝문제 링크 : https://acmicpc.net/problem/1924

 

#include <iostream>
using namespace std;

int		getNumberOfDays(int	month)
{
    int days;
    
    if (month < 8)
    {
        if (month == 2)
            days = 28;
        else if (month % 2)
            days = 31;
        else
            days = 30;
    }
    else
    {
        if (month % 2)
            days = 30;
        else
            days = 31;
    }
    return days;
}

int 	main()
{
    int		month, date;
    int		i, days;
    string	dayOfWeek[7] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};

    cin >> month >> date;
    i = 1;
    days = 0;
    while (i != month && month != 1)
    {
        days += getNumberOfDays(i);
        i++;
    }
    days += date;
    cout << dayOfWeek[(days % 7)] << '\n';
    return 0;
}

getNumberOfDays 함수에 month를 넘겨서 해당 월의 날짜수를 반환하는 방법 사용.  

 

그리고 별찍기 문제도 끝냈지만 포스팅엔 생략. 별찍기는 기본 단계를 해결하면 복잡한 그림도 기본문제를 조합해서 하면 돼서 쉬웠다. 

 

 

 

참고