https://www.acmicpc.net/problem/1157
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
s = s.toUpperCase(); //전부 대문자로 바꾸기
int[] al = new int[26];
for(int i=0;i<s.length();i++){
al[s.charAt(i)-65]++; //A의 아스키코드 값이 65라서 알파벳 순서대로 index가 됨
}
int max = -1;
int ch = -2;
for(int i=0;i<26;i++){
if(max < al[i]){
max = al[i];
ch = i;
}
else if(max == al[i]){
ch = -2; //이게 핵심이었다고 생각함. 아래 글로 서술하겠음
}
}
System.out.println((char)(ch+65)); //아스키코드 63은 ?임
}
}
이 문제에서 핵심은 else if문에서 (max == al[i])일 때 ch = -2로 설정한 부분!
문제에서 까다로웠던 조건이 알파벳의 개수가 최대인 것들이 여러 개 존재하면 ?를 출력하라는 부분이었다.
이 부분을 짜려고 max 값을 구한 후에 다시 순회하면서 max값이랑 같은 값을 같은 애들을 count 했었는데,,,
위의 코드에서는 for문 한번으로 max값도 찾고 중복의 경우까지 다 걸렀다..!
max값이 결정되지 않은 상태에서 else if문으로 ch가 -2가 되더라도 상관없다!
왜냐면 진짜 max값이 나오면 다시 ch를 업데이트하니까!
그리고 처음으로 만난 가장 큰 값이 max를 차지할거고, 만약에 그 이후에 max와 같은 크기의 값이 나오면 그때 ch가 최종으로 -2로 업데이트될 것이다..!
와 진짜 이 코드 짠 사람 천잰가봐,,, 오늘도 천재들의 머리에 감탄하고 간다...
아 나는 HashMap도 쓰고 난리를 쳤는데 위의 방법이 이 문제에서는 더 간단하고 효율적으로 동작하길래 다른 분들 답안 참고해서 바꿨다ㅎㅎ
부끄럽지만 HashMap으로 푼 코드도 아래에 첨부한다,,ㅎ
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
s = s.toUpperCase();
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
for(int i=0;i<s.length();i++){
map.put(s.charAt(i), map.getOrDefault(s.charAt(i),0)+1);
}
int max = -1;
char key = '0';
char max_key = '0';
int cnt=0;
Iterator iter = map.keySet().iterator();
while(iter.hasNext()){
key = (char)iter.next();
int value = map.get(key);
if(max < value){
max = value;
max_key = key;
}
}
iter = map.keySet().iterator();
while(iter.hasNext()){
key = (char)iter.next();
if(map.get(key) == max)
cnt++;
}
if(cnt != 1)
System.out.println("?");
else
System.out.println(key);
}
}
아 그리고 아래 코드는 자바에서 중복되는 값을 셀 때 유용한 코드!
해시맵이 getOrDefault라는 함수를 갖고 있는데 조회했을 때 있으면 그 값을 반환, 없으면 default를 0(설정가능)을 반환해요!
그럼 그 값에 +1 해서 put해주면 중복해서 count를 해주겠죠!
이 문제 풀면서 파이썬 count를 얼마나 쓰고 싶었는지!!!ㅠㅠ
구글링하다가 발견해서 소장용으로 기록~!
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
s = s.toUpperCase();
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
for(int i=0;i<s.length();i++){
map.put(s.charAt(i), map.getOrDefault(s.charAt(i),0)+1);
}
}
}
'알고리즘 (for 코딩테스트) > 백준_자바 (Java)' 카테고리의 다른 글
소수 판별 3가지 방법 | 에라토스테네스의 체 | 자바 | Java (0) | 2021.08.27 |
---|---|
[Java 자바] 백준 알고리즘 1929번 답 : 소수 구하기 (0) | 2021.08.27 |
백준 출력 형식이 잘못되었습니다. | 백준 Java | 백준 개, 고양이 문제 오류 (0) | 2021.08.20 |
[Java 자바] 백준 알고리즘 1152번 답 : 단어의 개수 (0) | 2021.08.19 |
백준 자바로 시작할 때 알아야할 Point (0) | 2021.08.18 |
최근댓글