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의 값을 저장하고, 중복된 값이 있다면 ?를 출력
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개면 최대값을 출력한다
+) 문제를 보자마자 파이썬으로는 이렇게 풀면 되겠다! 가 떠올랐는데, 자바는 좀 오래걸렸다
파이썬으로 푼 방식대로 자바도 풀 수 있지 않을까?
'알고리즘' 카테고리의 다른 글
[백준] 2438번: 별 찍기 - 1(java, python) (0) | 2022.07.03 |
---|---|
[백준] 1546번: 평균 (java, python) (0) | 2022.07.02 |
[백준] 1152번: 단어의 개수(java, python) (0) | 2022.07.01 |
[백준] 1008번: A/B (java, python) (0) | 2022.07.01 |
[백준] 17386번: 선분 교차 1(python) (0) | 2021.09.21 |