반응형

백준 1157번 문제입니다. (solved.ac)기준 브론즈 1 문제입니다.

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

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

문제

문제 접근

예전에 처음 C++로 풀었던 문제인데... 그 당시 코드를 확인해보니 굉장히 눈갱이더라구요... 사실 이번에 코틀린으로 다시 작성한 코드도 훨씬 간단하게 줄일 수 있을 것 같기도 합니다. 현재 실력도 단순 문제 구현에 급급하기도 하고 구현을 잘하는 것 같지도 않아서 꾸준히 문제를 다시 풀어야겠습니다. 예전에 C++로 풀었던 코드는 가장 아래부분에 추가해놓겠습니다.

 

우선 대소문자 구분을 하지 않기 때문에 입력받은 문자열을 .uppercase()를 사용하여 대문자로 바꿔준 후 진행하였습니다.

코틀린으로 이 문제를 푸는 과정에서는 계수정렬을 사용하였습니다.

알파벳의 빈도수를 담을 cntArray라는 크기 26(알파벳 개수가 26개)의 IntArray를 만들고 각 인덱스를 0으로 초기화 시켜주었고

alphabet 변수는 "A"로 선언, 2중 반복문을 사용하여 알파벳의 빈도수가 cntArray에 저장될 수 있도록 하였습니다.

cntArray에 빈도수가 다 담기게 된다면 cntArray에서 forEach구문을 사용하여 최대 빈도수인 max와 max가 있는 위치인 maxIndex를 찾을 수 있도록 하였습니다.

최대 빈도수(max)가 중복되면 "?"가 출력되어야 하므로 최대 빈도수가 담긴 위치(cntArray[maxIndex])를 0으로 초기화해주었고 그 후에도 cntArray에 max가 있다면 ?를 출력하고

없다면(중복되지 않았다면) maxIndex 번째의 알파벳을 출력하도록 만들었고

getUppercase()를 만들어 n을 넣으면 n+1번째 알파벳이 나오도록 구현하였습니다.(인덱스가 0부터 시작하기 때문)

정답 코드

fun main() {

    // 대소문자 구별을 하지않으므로 대문자로 변환 후 생각.
    val string = readln().uppercase()
    // 알파벳의 빈도수를 담을 배열 [0]은 A의 빈도수, [1]은 B의 빈도수...
    val cntArray = IntArray(26, { 0 })
    var alphabet = 'A'

    // 2중 반복문을 돌고나면 알파벳의 빈도수가 cntArray에 저장됨.
    for (i in 0 until 26) {
        for (j in 0 until string.length) {
            if (string[j] == alphabet) cntArray[i]++
        }
        alphabet++
    }

    // 최대 빈도수
    var max = 0
    // 최대 빈도수가 있는 인덱스
    var maxIndex = 0
    cntArray.forEachIndexed { index, it ->
        if (max < it) {
            max = it
            maxIndex = index
        }

    }

    // 최대 빈도수가 중복되면. "?" 출력하도록 만들기 위해서
    // cnt[maxIndex](빈도수가 최대인 부분) 부분을 0으로 초기화
    // 빈도수가 최대인 부분을 0으로 만들었는데 최대 빈도수(max)가
    // cntArray에 존재한다면 최대 빈도수가 중복된다는 뜻이므로 "?" 출력
    cntArray[maxIndex] = 0
    if (max in cntArray) print("?")
    else print(getUppercase(maxIndex))

}

fun getUppercase(n: Int): Char {
    // 아스키 코드에서 대문자는 A == 65, B == 66 ...
    return (n + 65).toChar()
}

C++ 눈갱 코드

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    int ans[26];
    int maxVal = 0;
    char realans = '?';
    
    for (int i =0; i < 26; i++)
    {
            ans[i] = 0;
    }
    
    cin >> s;
    
    
    for (int i = 0; i < s.length(); i++ )
    {
    
        if(s[i] == 'a' || s[i] == 'A')
            ans[0]++;
        else if(s[i] == 'b' || s[i] == 'B')
            ans[1]++;
        else if(s[i] == 'c' || s[i] == 'C')
            ans[2]++;
        else if(s[i] == 'd' || s[i] == 'D')
            ans[3]++;
        else if(s[i] == 'e' || s[i] == 'E')
            ans[4]++;
        else if(s[i] == 'f' || s[i] == 'F')
            ans[5]++;
        else if(s[i] == 'g' || s[i] == 'G')
            ans[6]++;
        else if(s[i] == 'h' || s[i] == 'H')
            ans[7]++;
        else if(s[i] == 'i' || s[i] == 'I')
            ans[8]++;
        else if(s[i] == 'j' || s[i] == 'J')
            ans[9]++;
        else if(s[i] == 'k' || s[i] == 'K')
            ans[10]++;
        else if(s[i] == 'l' || s[i] == 'L')
            ans[11]++;
        else if(s[i] == 'm' || s[i] == 'M')
            ans[12]++;
        else if(s[i] == 'n' || s[i] == 'N')
            ans[13]++;
        else if(s[i] == 'o' || s[i] == 'O')
            ans[14]++;
        else if(s[i] == 'p' || s[i] == 'P')
            ans[15]++;
        else if(s[i] == 'q' || s[i] == 'Q')
            ans[16]++;
        else if(s[i] == 'r' || s[i] == 'R')
            ans[17]++;
        else if(s[i] == 's' || s[i] == 'S')
            ans[18]++;
        else if(s[i] == 't' || s[i] == 'T')
            ans[19]++;
        else if(s[i] == 'u' || s[i] == 'U')
            ans[20]++;
        else if(s[i] == 'v' || s[i] == 'V')
            ans[21]++;
        else if(s[i] == 'w' || s[i] == 'W')
            ans[22]++;
        else if(s[i] == 'x' || s[i] == 'X')
            ans[23]++;
        else if(s[i] == 'y' || s[i] == 'Y')
            ans[24]++;
        else if(s[i] == 'z' || s[i] == 'Z')
            ans[25]++;
    }
    
    for (int i = 0; i < 26; i++)
    {
        if (maxVal < ans[i])
        {
            maxVal = ans[i];
            
            if(i == 0)
            {
                realans = 'A';
            }
            else if(i == 1)
            {
                realans = 'B';
            }
            else if(i == 2)
            {
                realans = 'C';
            }
            else if(i == 3)
            {
                realans = 'D';
            }
            else if(i == 4)
            {
                realans = 'E';
            }
            else if(i == 5)
            {
                realans = 'F';
            }
            else if(i == 6)
            {
                realans = 'G';
            }
            else if(i == 7)
            {
                realans = 'H';
            }
            else if(i == 8)
            {
                realans = 'I';
            }
            else if(i == 9)
            {
                realans = 'J';
            }
            else if(i == 10)
            {
                realans = 'K';
            }
            else if(i == 11)
            {
                realans = 'L';
            }
            else if(i == 12)
            {
                realans = 'M';
            }
            else if(i == 13)
            {
                realans = 'N';
            }
            else if(i == 14)
            {
                realans = 'O';
            }
            else if(i == 15)
            {
                realans = 'P';
            }
            else if(i == 16)
            {
                realans = 'Q';
            }
            else if(i == 17)
            {
                realans = 'R';
            }
            else if(i == 18)
            {
                realans = 'S';
            }
            else if(i == 19)
            {
                realans = 'T';
            }
            else if(i == 20)
            {
                realans = 'U';
            }
            else if(i == 21)
            {
                realans = 'V';
            }
            else if(i == 22)
            {
                realans = 'W';
            }
            else if(i == 23)
            {
                realans = 'X';
            }
            else if(i == 24)
            {
                realans = 'Y';
            }
            else if(i == 25)
            {
                realans = 'Z';
            }
            
            
        }
        else if(maxVal == ans[i])
        {
            realans = '?';
        }
    }
    
    if(s.length() != 1)
    {
        cout << realans;
    }
    else if(s.length() == 1)
    {
        char ans = toupper(s[0]);
        cout << ans;
    }
    
    
    return 0;
}

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기