반응형
1. 문제 추상화
입력된 문장에서 가장 많이 사용된 알파벳을 출력하시오.
2. 제약조건
대문자와 소문자는 같은 문자 취급한다.
3. 알고리즘
아스키코드 문자표 활용
1. 알파벳 배열 생성
2. 각 인덱스는 알파벳의 아스키코드표 십진수와 대응
3. 소문자 십진수가 대문자 십진수보다 +32 큼.
4. 풀이
< 내 풀이 >
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 내 풀이
Scanner sc = new Scanner(System.in);
String data = sc.next();
int size = 'Z'-'A'+1; // 알파벳 개수
int[] countAlphabet = new int[size]; // 알파벳 배열 생성
for(int i=0; i<data.length(); i++) {
char value = data.charAt(i);
if(value > 'Z') { // 'Z'보다 큰 문자는 소문자임
value -= ( 'a' - 'A' ); // 'a' - 'A' 는 십진수 32
}
countAlphabet[value-'A']++;
}
// 문제점 : 일반적인 풀이보다 쓸데 없는 변수를 많이 사용
int max = 0;
int indexOfMax = 0;
boolean isDuplicate = false;
for(int i=0; i<countAlphabet.length;i++) {
int value = countAlphabet[i];
if( value > max ) {
max = value;
indexOfMax = i;
isDuplicate = false;
}else if ( value == max ) {
isDuplicate = true;
}
}
// 문제점 : 일반적인 풀이보다 조건 판단이 하나 더 사용 됨
if(isDuplicate) {
System.out.println("?");
}else {
System.out.println((char)(indexOfMax + 'A'));
}
}
}
<일반적인 풀이>
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String data = sc.next();
int size = 'Z'-'A'+1;
int[] countAlphabet = new int[size];
for(int i=0; i<data.length(); i++) {
char value = data.charAt(i);
if(value > 'Z') {
value -= ( 'a' - 'A' );
}
countAlphabet[value-'A']++;
}
int max = -1;
char ch = '?';
for(int i=0; i<size;i++) {
if( countAlphabet[i] > max ) {
max = countAlphabet[i];
ch = (char)(i + 'A');
}else if ( countAlphabet[i] == max ) {
ch = '?';
}
}
System.out.println(ch);
}
}
개선해야 할 점
나는 중간에 쓸데없는 변수를
생성하여 코드가 길어지고
조건 판단도 늘었다.
이해하기 쉬운 코드란
과정 안에 목표가 녹아있는 코드이다.
중간에 매개과정이 들어가면 길을 잃을 수 있다.
문장도 주어-서술어가 붙어 있는 문장이
이해하기 쉽듯,
코드도 중간에 매개과정을 단순화시켜
표현하는 것이 중요하다.
반응형
'문제풀이' 카테고리의 다른 글
[JAVA] 백준 1316번 그룹단어 체커 : 중복값 (0) | 2021.07.13 |
---|---|
[JAVA] 백준 5622번 다이얼 : Switch문 (0) | 2021.07.12 |
[JAVA] 백준 10809번 알파벳 찾기 : 아스키코드 (0) | 2021.07.11 |
[JAVA] 백준 1065번 한수 : 등차수열 (0) | 2021.07.10 |
[JAVA] 백준 3052번 나머지 : 중복값 제거 (0) | 2021.07.10 |