백준 - 1157번 단어 공부(문자열, 아스키, 삼항연산자)

Kiwoong Park·2023년 5월 16일
0

문제

C++ 풀이

알파벳의 count배열을 만들고 최대 개수와 최대 개수인 알파벳을 갱신하는 방식으로 접근하였다.

#include <iostream>
using namespace std;

int main ()
{
    int asc[1000]={0}, mx=0, eqn=0;  // asc는 ascii코드의 count배열, 
                                     // mx은 최대 개수, eqn은 동일 개수 확인 토글 변수
    string str;
    char mxc;                        // mxc는 최대 개수일 때의 char 값 
    cin >> str;
    for (int a:str){
        if (a>96) a-=32;            // 소문자일 경우 대문자로 변환
        asc[a]++;                   // 개수를 하나 늘리기
        if (mx < asc[a]){           // 최대  개수 갱신 시
            mx=asc[a];              // 최대 개수와 그때의 char 저장
            mxc=char(a);
            eqn=0;                  // 최대 개수 갱신되어 
                               // 같은 경우를 나타내는 eqn을 false로 저장
        } 
        else if (mx == asc[a]) eqn=1; //개수가 늘었는데 기존 최대값과 같을 시 
                                      // eqn을 true로 저장
    }
    cout << (eqn?'?':mxc);            // 삼항연산자로 출력
  
}

C++ 숏코딩 분석하기

#import<iostream>
int a[26],c=26,d,e;  // a는 알파벳의 count 배열로 보인다.
char b;
main(){
	while(std::cin>>b) // string 자료형으로 받지 않고 char 자료형으로 한 문자씩 입력을 받았다.
    	a[b>96?b-97:b-65]++; // 96은 대문자 Z의 아스키코드 번호로 96보다 크면 소문자를 의미한다. 
        // 즉 소문자이면 'a'에 해당하는 97을 빼서 0번~25번 인덱스의 숫자를 하나 늘리고, 
        // 아니면 'A'에 해당하는 65를 빼서 0번 ~ 25번 인덱스의 숫자를 늘린다.
       
    for(;c--;) // 26개의 알파벳 개수인 c를 줄이며 0일 때까지 순회
         // 배열 a를 끝에서 부터 확인하면서 comma(',') 연산자를 통해 
         // a[c]>d가 true인 경우 d에 최대값을 저장하고, e에는 그때의 문자를 저장한다.
         // false인 경우 다시 삼항 연산자를 통해
         // a[c]-d가 0 인 경우, 즉 a[c]=d인 같은 경우 e에 -2를 할당하여
         // ?의 아스키 코드 값 63을 만든다.
    	a[c]>d?d=a[c],e=c:a[c]-d?0:e=-2;
    std::cout<<char(e+65);
}
profile
You matter, never give up

0개의 댓글