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로 작성하여도 무관하다.