문제풀이

[JAVA] 백준 1157번 단어 공부 : 이해하기 쉬운 코드란?

IT록흐 2021. 7. 11. 11:01
반응형
 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

 

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);
		
		
	}

}

 

 

개선해야 할 점

 

나는 중간에 쓸데없는 변수를

생성하여 코드가 길어지고

조건 판단도 늘었다.

 

이해하기 쉬운 코드란

과정 안에 목표가 녹아있는 코드이다.

 

중간에 매개과정이 들어가면 길을 잃을 수 있다.

 

문장도 주어-서술어가 붙어 있는 문장이

이해하기 쉽듯,

코드도 중간에 매개과정을 단순화시켜

표현하는 것이 중요하다.

 

 

 

반응형