문제 링크
난이도 : 브론즈 3

문제 내용

문장을 읽은 뒤, 줄의 첫 글자를 대문자로 바꾸는 프로그램을 작성하시오.

입력

첫째 줄에 줄의 수 N이 주어진다. 다음 N개의 줄에는 문장이 주어진다. 각 문장에 들어있는 글자의 수는 30을 넘지 않는다. 모든 줄의 첫 번째 글자는 알파벳이다.

출력

각 줄의 첫글자를 대문자로 바꾼뒤 출력한다.

문제 분석

N 입력받고 n만큼 반복

첫 글자만 대문자화해서 바로 출력하고 줄바꿈

대문자 A의 아스키코드는 65

소문자 a의 아스키코드는 97

따라서 소문자를 대문자화 하려면 -32하면 됨

작성한 코드

// 250213
 
#include <iostream>
 
using namespace std;
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    int n;
    string s;
 
    cin >> n;
    cin.ignore(); // 입력 전 버퍼 비우기
    while(n--){
        getline(cin, s, '\\n'); // 개행문자 미포함 한 줄 받기
        if (s[0] > 96 && s[0] < 123) s[0] -= 32;
        cout << s << "\\n";
    }
}

하다가 문제가 발생

  1. 아무생각없이 scanf 받다보니 띄어쓰기 들어오면 뒷 부분이 무시됨
  2. 그래서 cin.getline 했는데, 뭔가 오류가 뜸
  3. 알고보니 구분자를 “\n”로 해서 오류가 났던것, ‘\n’로 고치니 문제 해결됨
  4. 근데? N 입력받은 다음에 갑자기 끝나버림
  5. 버퍼에 개행문자가 남아있어서 생긴 문제. cin.ignore()로 버퍼 비우니 성공함
  • cin.ignore()는 매개변수가 없으면 다 비우고, 있으면 그 개수만큼 비움

우수 코드 분석

#include<stdio.h>
 
int n;
char s[44];
 
int main(){
	for(scanf("%d\\n", &n);n--;)gets(s), s[0]+=s[0]>='a'?'A'-'a':0, puts(s);
	return 0;
}

이분은 아예 C 스타일로 짜심

s[0] += s[0] ≥’a’?’A’-’a’:0

첫 글자가 소문자 a보다 크면 대문자 A에서 소문자 a를 뺸 만큼(-32) 더한다 ⇒ 대문자화 한다