본문 바로가기

알고리즘

[백준] 1157번: 단어 공부 (java, python)

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

 


💡 주의 사항

대소문자 구분은 하지 않는 대신, 출력은 대문자

그리고 많이 반복한 문자가 2개 이상인 경우 ? 출력하기


🗒 풀이

java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int[] alphabet = new int[26];
        Scanner sc = new Scanner(System.in);
        String s = sc.next().toUpperCase();

        for (int i = 0; i < s.length(); i++) {
            alphabet[s.charAt(i) - 65]++;
        }

        int max = 0;
        char c = '?';
        for (int i = 0; i < alphabet.length; i++) {
            if (alphabet[i] > max) {
                max = alphabet[i];
                c = (char) (i + 65);
            } else if (alphabet[i] == max) {
                c = '?';
            }
        }
        System.out.println(c);
    }
}
  • charAt을 사용해 char값으로 받아온 후 int로 변환하여 아스키 코드로 변환
  • 아래 표를 보면, 대문자 A의 범위는 십진수로 65번~90번이다. (참고로 소문자는 97번에서 122번)
  • alphabet 배열의 인덱스 값은 0번이므로, s에서 나온 각 알파벳의 개수를 센 것을 저장할 때 인덱스 값 계산을 위해 65를 빼준다. (alphabet[s.charAt(i) - 65]++;)
  • 각 알파벳이 나온 개수를 저장했으면, for문을 이용해 max의 값을 저장하고, 중복된 값이 있다면 ?를 출력

출처 : https://ko.wikipedia.org/wiki/ASCII


python

s = input().upper()

cnt_list = list(set(s))
count_list = []
for i in cnt_list:
    cnt = s.count(i)
    count_list.append(cnt)

print('?' if count_list.count(max(count_list)) > 1 else cnt_list[count_list.index(max(count_list))])
  • input() 즉시 upper() 함수로 대문자 변경
  • 문자열 s를  set 으로 변경하여 중복을 없애고, 사용에 용이하게끔 list로 변환
  • cnt_list의 각 항목을 탐색하여, 문자열 s에 몇 개가 들어있는지 count() 함수를 사용하여 count_list에 저장
  • count_list에서 count_list의 최대값의 수를 세고(count), 개수가 2 이상이면 '?', 1개면 최대값을 출력한다 

+) 문제를 보자마자 파이썬으로는 이렇게 풀면 되겠다! 가 떠올랐는데, 자바는 좀 오래걸렸다

파이썬으로 푼 방식대로 자바도 풀 수 있지 않을까?