Coding/BOJ

[BOJ 백준] 1157 - 단어 공부 (C / C++)

Dev_Klare 2023. 11. 3. 02:26

문제 바로가기

https://www.acmicpc.net/problem/1157


관련 알고리즘

- 아스키코드


정답 및 해설

문자열을 입력받아 대소문자 구분 없이 가장 많이 포함된 알파벳을 찾는 문제이다.

아스키코드를 사용하여 간단하게 풀어낼 수 있겠지만

대소문자 구분이 없다는 점에 주의해서 코드를 작성해야 한다.

 

C++

더보기
#include<bits/stdc++.h>
using namespace std;
int main(){
    char c;
    int i,max=0,s[26]={0,};
    while(1){
        cin>>c;
        if(cin.eof()) break;
        if(c>='a') c-=32;
        s[c-'A']++;
    }
    for(i=1; i<26; i++){
        max = s[i]>s[max] ? i:max;
    }
    for(i=0; i<26; i++){
        if(i==max)  continue;
        else if(s[i]==s[max]){
            cout<<'?';
            return 0;
        }
    }
    cout<<char(max+'A');
}

 

Line 해설
6 while(1) 문을 이용해서 무한루프에 들어간다.
7 cin 함수로 char 타입 변수 c에 문자를 한 글자씩 입력받는다.
8 cin.eof() 로 입력 문서의 끝을 인식했다면 break 문으로 while 문을 빠져나온다.
9 'a'의 ASCII 코드 값은 97, 'A'의 ASCII 코드 값은 65 이므로
소문자 알파벳에서 32를 빼면 대문자 알파벳으로 변환할 수 있다.
if(c>='a') 조건문을 통해 입력한 알파벳이 소문자인 경우 (a,b,c,...) c-=32를 통해 대문자로 변경한다.
10 s[N] 배열은 알파벳 'A'를 기준으로 N번째 알파벳이 등장한 횟수를 저장하는 배열이다.
'A'를 입력 받았다면 s['A'-'A'] 즉, s[0]의 값을 1 증가시킨다.
'C'를 입력 받았다면 s['C'-'A'], 'C'의 ASCII 코드는 67, 'A'는 65 이므로 s[2]의 값이 1 증가한다.
12 ~ 13 for 반복문을 돌리면서 가장 많이 등장한 알파벳이 몇 번째 알파벳인지 찾는다.
15 ~ 19 다시 한 번 for 반복문을 통해 가장 많이 등장한 알파벳이 두 개 이상인지 체크한다.
만약 두 개 이상 존재한다면 문제 조건에 따라 "?"을 출력한 후, return 0;를 통해 프로그램을 종료한다.
22 위의 for 문을 통해 유일하게 하나 존재한다는 것을 확인했다면
해당 알파벳(A를 기준으로 max 번째)을 출력한다.

※ <bits/stdc++.h> 헤더파일은 문제 풀이에 필요한 대부분의 헤더파일을 한 번에 선언할 수 있는 헤더파일이다.

위에 관해서는 나중에 다른 글에서 다루기로 한다.


C

더보기
#include<stdio.h>
int main(){
    char c;
    int i,max=0,s[26]={0,};
    while(scanf("%c",&c) != EOF){
        if(c>='a') c-=32;
        s[c-'A']++;
    }
    for(i=1; i<26; i++){
        max = s[i]>s[max] ? i:max;
    }
    for(i=0; i<26; i++){
        if(i==max)  continue;
        else if(s[i]==s[max]){
            printf("?");
            return 0;
        }
    }
    printf("%c",max+'A');
}

 

Line 해설
5 while(scanf("%c",&c) != EOF) 문을 이용해서 EOF까지 문자를 입력받는다.
EOF 는 End Of File 의 약자로 파일의 끝(입력의 끝)을 의미한다.
6 'a'의 ASCII 코드 값은 97, 'A'의 ASCII 코드 값은 65 이므로
소문자 알파벳에서 32를 빼면 대문자 알파벳으로 변환할 수 있다.
if(c>='a') 조건문을 통해 입력한 알파벳이 소문자인 경우 (a,b,c,...) c-=32를 통해 대문자로 변경한다.
7 s[N] 배열은 알파벳 'A'를 기준으로 N번째 알파벳이 등장한 횟수를 저장하는 배열이다.
'A'를 입력 받았다면 s['A'-'A'] 즉, s[0]의 값을 1 증가시킨다.
'C'를 입력 받았다면 s['C'-'A'], 'C'의 ASCII 코드는 67, 'A'는 65 이므로 s[2]의 값이 1 증가한다.
9 ~ 10 for 반복문을 돌리면서 가장 많이 등장한 알파벳이 몇 번째 알파벳인지 찾는다.
12 ~ 16 다시 한 번 for 반복문을 통해 가장 많이 등장한 알파벳이 두 개 이상인지 체크한다.
만약 두 개 이상 존재한다면 문제 조건에 따라 "?"을 출력한 후, return 0;를 통해 프로그램을 종료한다.
19 위의 for 문을 통해 유일하게 하나 존재한다는 것을 확인했다면
해당 알파벳(A를 기준으로 max 번째)을 출력한다.

※ scanf() 함수는 에러가 발생하거나 EOF를 만나면 -1을 반환하게 된다.

따라서 scanf(~~) != EOF 구문은 scanf(~~) != -1로 작성하여도 무관하다.