백준 1157번 문제입니다. (solved.ac)기준 브론즈 1 문제입니다.
https://www.acmicpc.net/problem/1157
문제
문제 접근
예전에 처음 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;
}
'알고리즘 문제풀이[Algorithm]' 카테고리의 다른 글
[백준] 4673번 셀프 넘버(브루트포스 / 완전 탐색)(코틀린 - Kotlin) (0) | 2022.05.12 |
---|---|
[백준] 2309번 일곱 난쟁이(브루트포스 / 완전 탐색)(코틀린 - Kotlin) (0) | 2022.05.12 |
[백준] 1110 더하기 사이클(Kotlin - 코틀린) (0) | 2022.04.27 |
[백준] 1966번 프린터 큐(Kotlin - 코틀린) (0) | 2022.04.24 |
[백준] 10826 피보나치 수 4(BigInteger)(Kotlin - 코틀린) (0) | 2022.04.22 |
최근댓글