[백준] 1157 단어 공부 JAVA

·2024년 3월 10일

1일1백준 -Java-

목록 보기
6/60

문제

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

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

예제 입력

baaa

예제 출력

A

내가 했던 풀이 방법

  1. 단어를 입력받는다. 이때 모든 문자를 소문자로 변환해준다. (지금보니 대문자로 변경하는 게 두 번 일하지 않고 좋음)
  2. 2차원 배열을 만든다. 배열에는 해당 알파벳과 알파벳의 횟수를 넣을 것이다. (알파벳을 넣는 이유는 이후 횟수에 따른 정렬을 하기 위해서 해당 알파벳이 무엇인지를 기억해야하기 때문이다.)
  3. 단어의 길이만큼 for문을 돌면서 해당 알파벳의 숫자를 1씩 증가시켜준다.
  4. 배열을 정렬해준다.
  5. 배열의 마지막 횟수를 max로 두고 마지막 이전 (24번째 index) 횟수와 비교했을 때 같을 경우 ?를 출력하고 다를 경우 해당 알파벳을 출력해준다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        input = input.toLowerCase();
        int[][] english = new int[26][2];

        for(int i=0; i<26; i++) {
            for(int j=0;j<2; j++) {
                english[i][j]=0;
            } 
        }

        for(int i=0; i<input.length(); i++) {
            english[input.charAt(i)-97][0]++;
            english[input.charAt(i)-97][1] = Character.toUpperCase(input.charAt(i));
        }

        Arrays.sort(english, (o1, o2) -> {
            return o1[0]-o2[0];
        });

        int max = english[25][0];
        if (max==english[24][0]) {
            System.out.print("?");
        } else {
            System.out.print((char)english[25][1]);
        }
    }   
}

회고

브론즈치고 이전 문자열 문제들과 비교했을 때 난이도가 조금 있는 편이었다. 그리고 이번에 자바에서 가장 약한 부분인 정렬이 있어서 조금 더 시간이 걸렸던 것 같다. 그렇기에 정렬부분을 간단하게 정리하고 끝내도록 하겠다.

Comparable & Comparator

Comparable과 Comparator는 객체의 비교를 위한 인터페이스.
객체는 사용자가 기준을 정해주지 않는 이상 어떤 객체가 더 높은 우선순위를 갖는지 판단할 수 없음.

public interface Comparator<T> {
	int compare(T o1, T o2);
}

public interface Comparable<T> {
	public int compareTo(T o);
}

Comparable

Comparable 인터페이스는 compareTo(T o) 추상 메소드 하나만 존재.
자기 자신과 매개변수 객체를 비교.

Comparator

Comparable보다 좀 더 복잡하게 정렬이 가능하며 필요할 때마다 구현해서 사용할 수 있는 인터페이스.
실질적으로 int compare(T o1, T o2)를 구현해야 함.
두 매개변수 객체를 비교. 자기 자신을 기준으로 상대방과의 차이 값을 비교하여 반환

2차원 배열 정렬

overwrite

Arrays.sort(arr, new Comparator<int[]>() {
	@Override
    public int compare(int[] o1, int[] o2) {
    	if(o1[0] == o2[0]){ 
        	return o1[1] - o2[1];
		}else{ 
			return o1[0] - o2[0];
       }
	}
});

Lambda

Arrays.sort(arr, (o1,o2) -> (o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]));

참고 자료

Comparator 와 Comparable - JAVA

profile
Frontend🍓

0개의 댓글