관리 메뉴

cococo-coding

1157번. 단어 공부 본문

[BOJ] 코드 모음/C_baekJoon

1157번. 단어 공부

_dani 2023. 11. 23. 17:01
#include <stdio.h>
#include <string.h>

int main() {
    //1. 단어를 입력받는다.
    //2. 가장 많이 사용된 알파벳을 찾는다.
    //3. 그 알파벳을 출력한다.

    //1
    char word[1000001];
    scanf("%s", word);
    int len=strlen(word);

    //2 알파벳이 사용된 횟수만큼 배열을 생성한다.
    int cnt[26]; //알파벳개수를 넣을 배열
    int num; //0~25가 된 숫자를 넣을 변수 
    
    for(int i=0; i<len; i++){ //word길이만큼 for문을 돌려줌
        //2-1 대문자인 경우
        if('A'<=word[i] && 'Z'>=word[i]){
            num=word[i]-'A';
        }
        //2-2 소문자인 경우
        else if('a'<=word[i] && 'z'>=word[i]){
            num=word[i]-'a';
        }
        cnt[num]++; //나온 값=배열 숫자 이므로 배열인덱스에 나온값을 넣어 바로 증가시켜줌    
    }
 
    //3
    int max=0;
    int index=0;  
    
    for(int i=0; i<26; i++){      
        if(max<cnt[i]){ //여기서 cnt[i]< cnt[i+1]로 해서 계속 max가 z가 되는 상황이 발생... 주의...
            max=cnt[i];
            index=i;    
        }    
    }

    //알파벳 중 같은 갯수로 max가 있는 경우
    int check=0;
    for(int i=0; i<26; i++){
        if(max==cnt[i]) check++;
    }

    //check가 하나면 자기 자신만 있다는 것
    //하나이상이면 같은 max로 겹치는 애가 있다는 것
    if(check>1) {
        printf("?");
    }
    else{
        printf("%c\n", index+65);
    }
  
    return 0;
}

필요 개념

1. 알파벳 개수 세기

알파벳 개수를 넣을 배열을 생성하여 cnt[26]; 

입력받은 문자가 대문자인 경우와 소문자인 경우로 분류한다.

이 값들을 각각 A와 a만큼씩 빼주면 0~26사이의 숫자가 나온다. 

이를 cnt[26]에 넣어주면 된다. 

 

 

2. 같은 max값이 나온 경우 처리하기

check 변수를 생성하여 cnt배열에 한번 돌려준다.

예를 들어 i가 4번 나와 단독 max값인 경우)

max값이 4인데, A~Z까지 한번 돌린 경우에 check는 i 자기자신 한번만 더해지므로 1이 된다 

반면 i와 다른 알파벳이 동일하게 4번 나온 경우)

check값은 i와 다른 알파벳까지 2번이 나오게 되므로 ?를 출력하게 된다. 

느낀 점

값을 체크해야 할 경우 변수를 생성하여 그 값을 받아서 코드를 짜보자.

그리고 배열은 그 자체로 주소를 내포하고 있으므로 scanf에서 &를 쓰지 않는다. 


 

아래코드는 중간중간에 printf로 결과를 출력하면서 진행한 코드이다. 

혹시나 어디서 문제가 발생한지 찾아야한다면 이렇게 해도 좋을 것 같다. 

#include <stdio.h>
#include <string.h>

int main() {
    //1. 단어를 입력받는다.
    //2. 가장 많이 사용된 알파벳을 찾는다.
    //3. 그 알파벳을 출력한다.

    //1
    char word[1000001];
    scanf("%s", word);
    int len=strlen(word);

    //2 알파벳이 사용된 횟수만큼 배열을 생성한다.
    int cnt[26]; //알파벳개수를 넣을 배열
    int num; //0~25가 된 숫자를 넣을 변수 
    
    for(int i=0; i<len; i++){ //word길이만큼 for문을 돌려줌
        //2-1 대문자인 경우
        if('A'<=word[i] && 'Z'>=word[i]){
            num=word[i]-'A';
        }
        //2-2 소문자인 경우
        else if('a'<=word[i] && 'z'>=word[i]){
            num=word[i]-'a';
        }
        cnt[num]++; //나온 값=배열 숫자 이므로 배열인덱스에 나온값을 넣어 바로 증가시켜줌    
    }
 
    //가장 많이 사용된 알파벳을 배열에서 찾는다
    /*for(int i=0; i<26; i++){
        printf("%d ", cnt[i]);
    }    
    printf("\n");
    */
    //3
    int max=0;
    int index=0;  
    
    for(int i=0; i<26; i++){      
        if(max<cnt[i]){ //여기서 cnt[i]< cnt[i+1]로 해서 계속 max가 z가 되는 상황이 발생... 주의...
            max=cnt[i];
            index=i;    
        }    
    }

    //알파벳 중 같은 갯수로 max가 있는 경우
    int check=0;
    for(int i=0; i<26; i++){
        if(max==cnt[i]) check++;
    }

    //check가 하나면 자기 자신만 있다는 것
    //하나이상이면 같은 max로 겹치는 애가 있다는 것
    if(check>1) {
        printf("?");
    }
    else{
        printf("%c\n", index+65);
    }
  
    return 0;
}
    
    /*
    아래와 같이 쓰지말것. 배열은 주소의 의미를 내포하고 있어 &word로 쓰지않는다.
    scanf("%s", &word); 
    */

 

 

 

 

 

'[BOJ] 코드 모음 > C_baekJoon' 카테고리의 다른 글

1978번. 소수 찾기  (1) 2023.11.26
10250번. ACM 호텔  (1) 2023.11.23
2920번. 음계  (1) 2023.11.22
8958번. OX퀴즈  (2) 2023.11.22
2475번. 검증수  (0) 2023.11.21