4차시 문제 8번~15번 풀이 <백준 문제>
8. 단어 공부 <백준 1157>
그냥 코드 돌리면 된다.
코드는 다음과 같다.
#include <stdio.h>
#include <string.h>
int main() {
char arr[1000000];
scanf("%s",arr);
int n=strlen(arr);
int k,l=0,m,f=0;
for(int i=0;i<26;i++){
k=0;
for(int j=0;j<n;j++){
if(arr[j]==65+i||arr[j]==97+i){
k++;
}
}
if(k>l){
m=65+i;
f=0;
l=k;
}
else if(k==l)
f=1;
}
if(f==1){
printf("?");
return 0;
}
printf("%c",m);
return 0;
}
for 반복문을 통하여 알파벳 aA부터 zZ까지 하나하나씩 문자열에 들어간 개수만큼 k의 값을 더한다.
만약 k가 l보다 크다면 l에 k를 대입하고 f를 0으로 둔다.
f는 판별식 역할을 해주는데 만약 k가 l과 같다면 f가 1이 되어'?'를 출력해 주고 만약 아니라면 0이 되어 가장 많이 나온 문자를 대문자로 출력해 준다.
9. 알파벳 찾기 <백준 10809>
단어 찾기와 비슷한 알고리즘을 쓰면 된다.
코드는 아래와 같다.
#include <stdio.h>
#include <string.h>
int main(){
char S[100];
char s[26];
scanf("%s",S);
for(int i=0;i<26;i++)
s[i]=-1;
for(int i=97;i<=122;i++){
for(int j=0;j<strlen(S);j++){
if(S[j]==i){
s[S[j]-'a']=j;
break;
}
}
}
for(int i=0;i<26;i++)
printf("%d ",s[i]);
return 0;
}
먼저 문자열을 모두 -1로 채워준다.
그 뒤 알파벳의 소문자를 아스키코드로 변환하여 a부터 z까지 모두 찾은 후 그 알파벳 아스키코드값에 65를 빼서 숫자를 저장한다. 그 뒤 문자열에서 그 숫자에 해당하는 인덱스 값을 문장의 단어 위치로 바꿔준다.
마지막으로 문자열의 값을 모두 출력한다.
10. 단어의 개수 <백준 1152>
공백의 개수를 구하고 구한 개수에 1을 더하여 출력하면 단어의 개수가 된다.
for 반복문에서 문자열의 시작 인덱스를 1로 둘것이기 때문에 공백으로 시작하더라도 상관없다.
코드는 다음과 같다.
#include <stdio.h>
#include <string.h>
int main(){
int n=0;
char str[1000000];
scanf("%[^\n]",str);
int len=strlen(str);
if(len==1&&str[0]==' '){
printf("0");
return 0;
}
for(int i=1;i<len-1;i++){
if(str[i]==' ')
n+=1;
}
printf("%d",n+1);
return 0;
}
먼저 %[^\n]을 사용하여 문자열 입력이 공백으로 들어오더라도 계속 문자열에 저장할 수 있도록 하였다.
다음으로 만약 문자열의 길이가 1인 경우에는 0을 출력하고 프로그램을 종료하도록 하였다.
반복문으로 만약 문자열의 인덱스 값이 공백이면 n에 1을 더해준다.
마지막으로 n+1을 하여 공백의 개수가 아닌 단어의 개수를 출력해 준다.
11. OX퀴즈 <백준 8958>
O가 계속 나오면 1부터 연속으로 더하다가 X 값이 나오면 더하는 걸 멈추고 다시 O가 나오면 1부터 더한다.
마지막으론 더한 값을 모두 합쳐 출력해 준다.
코드는 다음과 같다.
#include <stdio.h>
#include <string.h>
int main()
{
char ox[80];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
int score=0;
int k=0;
scanf("%s",ox);
for(int j=0;j<strlen(ox);j++)
if(ox[j]=='O'){
k++;
score+=k;
}
else if(ox[j]=='X')
k=0;
printf("%d\n",score);
}
return 0;
}
반복할 횟수를 입력받고 그 횟수만큼 OX 문자열을 입력받는다.
그 뒤 방금 말했던 알고리즘을 사용하고 score에 더하여 그 값을 출력하면 된다.
12. 평균 <백준 1546>
점수를 뻥튀기 시켜 평균을 출력해주면 된다.
코드는 다음과 같다.
#include <stdio.h>
int main() {
int n;
double sum=0;
int scr[1000]={};
scanf("%d",&n);
int m=scr[0];
for(int i=0;i<n;i++){
scanf("%d",&scr[i]);
if(scr[i]>m)
m=scr[i];
}
for(int i=0;i<n;i++){
sum+=scr[i]/(double)m*100;
}
double avg=sum/n;
printf("%f",avg);
return 0;
}
반복할 횟수(과목의 개수)를 먼저 입력받는다.
다음으론 최댓값을 구하고 점수를 하나하나씩 최댓값으로 나눈 뒤 100만큼 곱하여 sum에 더한다.
sum을 반복한 횟수, 즉 과목의 개수만큼 나누어 평균을 구하고 그 값을 출력한다.
13. 숫자의 개수 <백준 2577>
계속 뭔가의 개수를 구한다..
숫자들 곱한 값을 문자열에 저장하고 숫자의 아스키코드값으로 찾아서 더하면 된다. <알파벳 개수 출력하기>와 비슷한 알고리즘이다.
코드는 다음과 같다.
#include <stdio.h>
#include <string.h>
int main() {
int A,B,C,sum=0,k;
scanf("%d",&A);
scanf("%d",&B);
scanf("%d",&C);
sum=A*B*C;
char str[11];
sprintf(str,"%d",sum);
for(int i=0;i<10;i++){
k=0;
for(int j=0;j<10;j++){
if(str[j]==48+i)
k++;
}
printf("%d\n",k);
}
}
여기선 sprintf라는 함수를 사용하였는데, ABC를 모두 곱한 값을 문자열로 바꿔주는 Wonderful한 함수다.
덕분에 문자열로 바꾼 뒤 아스키코드로 숫자를 찾고 해당 숫자가 몇 개 있는지 쉽게 출력한다.
14. 나머지 <백준 3052>
이것도 배열을 사용하면 편하다.
코드는 다음과 같다.
#include <stdio.h>
int main() {
int n,k=10;
char a[10];
for(int i=0;i<10;i++){
scanf("%d",&n);
a[i]=n%42;
}
for(int i=0;i<10;i++){
for(int j=0;j<i;j++){
if(a[i]==a[j]){
k--;
break;
}
}
}
printf("%d",k);
return 0;
}
배열 a를 두고 숫자 나머지의 개수는 10개라는 가정 하에 코드를 실행한다.
a에 입력한 숫자들을 42로 나눈 나머지의 값을 저장한다.
그리고 만약 a에서 겹치는 숫자들이 있다면 나머지의 개수에서 1만큼 뺀다.
마지막으로 나머지의 개수인 k의 값을 출력한다.
15. 음계 <백준 2920>
처음에 다장조 뭐시기 하는데 이건 문제의 의도와 전혀 상관이 없는 것 같다.
하지만 바보같은 나는 이 다장조에 큰 의미를 두어 노가다를 해버린다.
코드는 다음과 같다.
#include <stdio.h>
int main() {
int c=1,d=2,e=3,f=4,g=5,a=6,b=7,C=8;
int arr[8];
for(int i=0;i<8;i++){
scanf("%d",&arr[i]);
}
if(arr[0]==c){
for(int i=0;i<8;i++){
if(arr[i]!=i+1){
printf("mixed");
return 0;
}
}
printf("ascending");
return 0;
}
else if(arr[0]==C){
for(int i=0;i<8;i++){
if(arr[i]!=8-i){
printf("mixed");
return 0;
}
}
printf("descending");
return 0;
}
printf("mixed");
return 0;
}
정말 길다. return 0 이 무려 5개다.
먼저 다장조에 해당하는 번호를 저장해 준다.
그 뒤 배열 arr에 숫자를 입력받는다.
가장 먼저 입력받은 숫자가 1인지 8인지 구분하여 그에 알맞 조건문을 실행해준다.
조건문안에 있는 조건문을 통해 정순이면 ascending, 역순이면 descending, 그 둘 다 아니면 mixed를 출력한다.
이 문제는 다들 풀이법이 정말 다양해서 재밌는 문제였다.
**4차시를 하고 느낀 건데 개인적으로 백준의 티어 시스템이 정말 좋았다고 느껴졌다. 티어가 있다 보니 문제를 푸는 이유가 생기게 된다. 티어가 나의 코딩 실력과 성과를 보여준다는 점이 정말 좋은 것 같다. 지금 시험시간인데 백준티어만 올리고 있는 나를 보자니 정말 어리석다. 그래도 롤 티어 올리는 거보단 나은 거 같다. ^ _ ^