# 문제
# 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BOJ1157_v1 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine().toUpperCase(); // 대문자로 변환
int[] count = new int['z' - 'a' + 1]; // 알파벳 개수만큼 선언. 전체 0으로 초기화.
int max = -1; // 최대값 구하기 위한 변수
char result = ' ';
// 각 알파벳 등장 횟수 세기
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
count[c - 'A']++; // 해당 알파벳 자리의 count++ 해주기
}
// 가장 많이 등장한 알파벳 찾기
for (int i = 0; i < count.length; i++) {
if (count[i] > max) {
max = count[i]; // 가장 큰 수 저장
result = (char) (i + 'A'); // 알파벳 아스키코드 구하기
} else if (count[i] == max) {
result = '?';
}
}
System.out.println(result);
br.close();
}
}
# 입/출력 결과
# 과정
- 입력은 BufferedReader 클래스 사용
- String input에 입력받은 값을 대문자로 변환하여 저장
- int[] count를 알파벳 개수만큼 생성
- int max를 -1로 생성 -> a-z 알파벳 기본 0으로 세팅할 것이기 때문에 비교하기 위해서는 -1로 해야함
- char result 빈 문자로 생성
- for문 사용하여 알파벳 등장 횟수 세기
- : input.length() 만큼 반복
- : 알파벳 개수 크기로 생성한 count에 input의 알파벳 자리를 찾아서 count++ 해주기
- for문 사용하여 많이 등장한 알파벳 찾기
- : count.length 만큼 반복
- : if문 사용하여 count[i]가 max보다 크면 max에 count[i] 저장하고 result에 count[i]의 자리의 알파벳을 구해야하는데 아스키코드를 활용하여 구하기
- : 구하는 방법은 i + 'A' A의 아스키코드 값에 i를 더해주면 됨
- : count[i]와 max의 값이 동일하면 result에 ? 저장
- result 출력
# 메모
- 내가 처음에 작성한 코드는 apple을 입력 받으면 대문자로 변환 시킨 다음에 각 알파벳을 추출하여 ArrayList에 저장하는데 중복되는 알파벳은 제외하고 저장하였다. 그 다음에 ArrayList에 apple 한 글자씩 .contains() 하여 있으면 count를 세는 방식으로 했는데, 메모리초과하여 실패했다.
- 어떻게 줄일 수 있을지 고민을 해보았는데, 답을 찾지 못하여서 chat-gpt한테 나의 코드를 보여주면서 개선해 달라고 요청했다. 요청받은 결과는 본 포스팅에 작성한 코드이다. 코드를 보고 이해는 하지만 아스키코드를 활용한다는 점이 익숙하지 않아서 이해하는 속도가 더디었다. 윽...
▼ 내가 작성하고 메모리 초과로 실패한 코드. 불필요한 코드가 많았다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class BOJ1157_v2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine().toUpperCase(); // 대문자로 변환
ArrayList<String> inputArr = new ArrayList<>();
// 알파벳 추출 (중복x)
for (int i = 0; i < input.length(); i++) {
String c = String.valueOf(input.charAt(i));
if (inputArr.contains(c)) {
continue;
} else {
inputArr.add(c);
}
}
// count inputArr 크기 만큼 생성 후 모두 0으로 초기화
int[] count = new int[inputArr.size()];
// 중복 알파벳 count 세기
for (int i = 0; i < inputArr.size(); i++) {
for (int j = 0; j < input.length(); j++) {
String c = String.valueOf(input.charAt(j));
if (inputArr.get(i).equals(c)) {
count[i] += 1;
}
}
}
// 결과 구하기
int max = 0;
String result = "";
for (int i = 0; i < inputArr.size(); i++) {
if (count[i] > max) {
max = count[i];
result = inputArr.get(i);
} else if (count[i] == max) {
result = "?";
}
}
System.out.println(result);
br.close();
}
}
'코딩 테스트' 카테고리의 다른 글
[코딩테스트] 백준 1316번: 그룹 단어 체커 (0) | 2025.06.20 |
---|---|
[코딩테스트] 백준 2941번: 크로아티아 알파벳 (0) | 2025.06.18 |
[코딩테스트] 백준 10988번: 팰린드롬인지 확인하기 (0) | 2025.06.17 |
[코딩테스트] 백준 2444번: 별 찍기 - 7 (0) | 2025.06.16 |
[코딩테스트] 백준 3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰 (0) | 2025.06.16 |