반응형
출처: https://www.acmicpc.net/problem/1157
Approach
해당 문제는 alphabet[26]을 이용하면 해결할 수 있는 문제이다.
ex) alphabet[0] = 3; // 'A' or 'a'가 3번 나타남.
ex) alphabet[2] = 5; // 'C' or 'c'가 5번 나타남.
① 입력받는 문자열에 소문자/대문자가 모두 포함되는데
출력시에는 대문자로 하므로 대문자로 처리할 수 있도록 한다.
* 아스키 코드 이용
- 대문자 'A' 아스키코드 값 = 65
- 대문자 'a' 아스키코드 값 = 97
② 가장 많은 문자열이 여러개인지 확인한다.
③ 여러가지가 아닌 경우에는 하나의 문자만,
여러가지인 경우, '?' 출력 한다.
C++
#include <iostream>
#include <string>
using namespace std;
string str;
int alphabet[26], maxCnt;
char ans = '?';
int main()
{
// freopen("input.txt", "r", stdin);
cin >> str;
for (char ch : str)
{
if ('a' <= ch) ch = ch - 32; // 소문자를 대문자로 변경
alphabet[ch - 'A']++; // 0 ~ 26로 인덱스 조정
}
for (int ch = 0; ch <= 'Z' - 'A'; ch++) // 0 ~ 26
{
if (alphabet[ch] > maxCnt)
{
maxCnt = alphabet[ch];
ans = ch + 65; // 출력시에는 소문자에서 대문자로
}
else if (alphabet[ch] == maxCnt)
{
// 최대 개수가 여러가지인 경우
ans = '?';
}
}
printf("%c\n", ans);
}
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 문자열을 입력 받는다.
String str = sc.nextLine();
// 입력받은 문자열을 대,소문자 중 하나로 통일한다.
str = str.toUpperCase();
// 변환된 문자열에서 아스키코드를 이용한다.
// 알파벳 배열을 만든다(배열 크기 : 26개)
int[] arr = new int[26];
// 문자 하나하나 체크하면 배열의 원소를 업데이트한다.
for(int i=0; i < str.length(); i++){
int idx = str.charAt(i) - 65;
if(idx >= 0){ // 아스키 코드상 공백 문자는 32로 여기서는 -33으로 계산된다.
arr[idx]++;
}
}
int max = 0;
int idx = -1;
// 배열 중 원소가 가장 큰 값을 확인하며
for(int i=0; i < arr.length; i++){
if(max < arr[i]){
max = arr[i];
idx = i;
}
}
int smaeCnt = 0;
for(int i=0; i < arr.length; i++){
if(max == arr[i]){
smaeCnt++;
}
}
// 큰 값이 2개 이상이면 '?' 아니면 해당 (대)문자 출력
if(smaeCnt >= 2){
System.out.println("?");
}else{
System.out.println((char)(idx + 65));
}
}
}
반응형
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 1316 그룹 단어 체커 (0) | 2021.09.13 |
---|---|
[BOJ] 백준 1292 쉽게 푸는 문제 (0) | 2021.09.03 |
[BOJ] 백준 1152 단어의 개수 (0) | 2021.08.27 |
[BOJ] 백준 1094 막대기 (0) | 2021.08.26 |
[BOJ] 백준 1085 직사각형에서 탈출 (0) | 2021.08.25 |
댓글