728x90
1) 입력받은 문자열을 대문자 형태로 바꾼 뒤, char[]으로 변환하여 저장한다.
2) key값으로 'A'~'Z', 초기 value 값으로 0을 갖는 HashMap을 선언한다.
3) for문을 이용하여, char[] 배열의 character가 HashMap의 key와 일치하는 경우 해당 value에 +1을 해준다.
4) value값에 따라 오름차순 정렬하여, 1, 2번째 value가 같으면 ? 출력, 아니라면 1번째 key를 출력한다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[] word = sc.next().toUpperCase().toCharArray();
HashMap<Character, Integer> map = new HashMap<>();
for (char i='A'; i<='Z'; i++) map.put(i, 0);
for (int i=0; i<word.length; i++){
for (char j='A'; j<='Z'; j++){
if (word[i]==j){
map.put(j, map.get(j)+1);
}
}
}
List<Character> ordered = new ArrayList<>(map.keySet());
ordered.sort(((o1, o2) -> map.get(o2).compareTo(map.get(o1))));
if (map.get(ordered.get(0)).equals(map.get(ordered.get(1)))) System.out.println("?");
else System.out.println(ordered.get(0));
sc.close();
}
}
아래와 같이 입력받은 문자열을 배열로 만들어 반복문을 돌는 경우, 예제는 확인이 잘 되지만, 시간초과 오류가 발생한다.이는, 1,000,000 길이의 문자가 들어왔을 때 이중 for문에서 시간초과 발생하는 것이다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String word = sc.next().toUpperCase();
char[] wordArr = word.toCharArray();
HashMap<Character, Integer> countedMap = new HashMap<>();
for (int i=0; i<wordArr.length; i++){
int count = 0;
for (int j=0; j<wordArr.length; j++){
if (wordArr[i] == wordArr[j]) count++;
}
countedMap.put(wordArr[i], count);
}
List<Character> keySet = new ArrayList<>(countedMap.keySet());
keySet.sort(((o1, o2) -> countedMap.get(o2).compareTo(countedMap.get(o1))));
if (countedMap.get(keySet.get(0))==countedMap.get(keySet.get(1))){
System.out.println("?");
} else {
System.out.println(keySet.get(0));
}
sc.close();
}
}
728x90
'알고리즘' 카테고리의 다른 글
| 백준 1193 (Java) (0) | 2023.12.03 |
|---|---|
| 백준 2564 (Java) (1) | 2023.11.28 |
| 백준 25206 (Java) (1) | 2023.11.28 |
| 백준 1316 (Java) (0) | 2023.11.27 |
| 백준 2941 (Java) (1) | 2023.11.27 |