문제
https://www.acmicpc.net/problem/1157
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
----------------------------------------첫번째 방법----------------
import java.util.Scanner;
public class Main1157 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String string = sc.next();
sc.close();
char checkString = ' ';
char maxString = ' ';
int max = 0;
int count = 0;
int maxCount = 0;
for (int i=0; i<string.length(); i++) {
count = 0;
checkString = string.charAt(i);
for (int j=0; j<string.length(); j++) {
if (checkString == string.charAt(j)) {
count++;
}
}
if (max == count) {
maxString = '?';
} else if (max < count) {
max = count;
maxString = checkString;
}
}
if (maxCount == max) {
maxString = '?';
}
System.out.println(maxString);
}
}
------------------------------두번째 방법---------------------------
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main1157_1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String string = sc.next();
List<Character> checkString = new ArrayList<Character>();
string = string.toLowerCase();
sc.close();
for (int i=0; i<string.length(); i++) {
if (!checkString.contains(string.charAt(i))) {
checkString.add(string.charAt(i));
}
}
int max = 0;
char maxChar = ' ';
int[] count = new int[checkString.size()];
for (int i=0; i<string.length(); i++) {
if (checkString.contains(string.charAt(i))) {
count[checkString.indexOf(string.charAt(i))]++;
}
}
if (count.length == 1) {
maxChar = checkString.get(0);
}
for (int i=0; i<count.length; i++) {
if (max < count[i]) {
max = count[i];
maxChar = checkString.get(i);
}
if (i == count.length-1) {
break;
}
if (count[i] == count[i+1]) {
maxChar = '?';
}
}
System.out.println(Character.toUpperCase(maxChar));
}
}
1. 틀렸다.
2. 여태 풀은 문제 중 제일 오랜시간이 걸렸다. 뭔가 풀릴듯 말듯해서 더 시간을 끈듯하다. 하지만 결과는 오답.. 이클립스 내에선 다 올바르게 나왔는데 백준 홈페이지에선 오답처리가 되었다.
3. 사실 풀면서 너무 주먹구구식으로 접근을 해서 긴가민가 했는데, 아무래도 내가 놓친 부분이 있는 듯하다.
4. 첫번째 풀이를 하면서 먼저 입력된 문자의 중복을 제거해야 한다고 생각을 했고, 두번째 풀이에서 적용을 했다. 다른 블로그의 글과 비교했을 때 로직의 큰 흐름은 비슷한듯 하다.
5. 다만 처음 접근 방법 자체가 달랐는데, 아래 코드 처럼 문자의 코드값으로 접근을 해야했다는 점이다.
mport java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] arr = new int[26]; // 영문자의 개수는 26개임
String s = in.next();
for (int i = 0; i < s.length(); i++){
if ('A' <= s.charAt(i) && s.charAt(i) <= 'Z') { // 대문자 범위
arr[s.charAt(i) - 'A']++; // 해당 인덱스의 값 1 증가
}
else { // 소문자 범위
arr[s.charAt(i) - 'a']++;
}
}
int max = -1;
char ch = '?';
for (int i = 0; i < 26; i++) {
if (arr[i] > max) {
max = arr[i];
ch = (char) (i + 65); // 대문자로 출력해야하므로 65를 더해준다.
}
else if (arr[i] == max) {
ch = '?';
}
}
System.out.print(ch);
}
}
6. 문자코드로 접근하는 방법만 인지하면 크게 어려움없는 문제였는데 해당 방식을 생각해내지 못해 풀이에 어려움이 컸다. 다음에 비슷한 문제를 또 풀게된다면 잊지말고 문자코드를 활용해서 접근하자.
'백준' 카테고리의 다른 글
백준 10819번 ☆ (0) | 2022.11.03 |
---|---|
백준 2941번 (0) | 2022.11.01 |
백준 11720번 (0) | 2022.10.27 |
백준 4673번 (0) | 2022.10.26 |
백준 2738번 (0) | 2022.10.26 |