[Hackerrank] Sherlock and the Valid String - (String - Easy)
www.hackerrank.com/challenges/two-characters/problem
문제
문자열 s가 주어지면, 이 문자열에서 2개의 문자만 남기고 모두 지웠을 때,
교대로 문자가 완성되면서 가장 긴 문자열의 길이를 구하는 것이다
예를 들어 s = beabeefeab일 때,
(e,f)를 지우면 babab로 5이다
해결
Map에 문자열:문자열의 개수로 넣는다
그리고 문자열의 개수 차이가 1 이하가 되어야 서로 연속되지 않고 교대로 문자가 반복될 가능성이 있다
따라서 문자열의 개수 차이가 절대값 1 이하인 문자열을 Set에 넣는다
마지막으로 리스트를 하나 생성한 후,
Set에 포함된 문자열이 존재할 경우만 문자열의 길이를 list에 넣는다
가장 긴 길이를 구해야하니 list를 내림차순 정렬한 후 index 0번을 출력한다
public class TwoCharacters {
// Complete the alternate function below.
static int alternate(String s) {
Map<Character, Integer> map = new HashMap<>();
List<Character> inputList = new ArrayList<>();
for (char c : s.toCharArray()) {
inputList.add(c);
map.putIfAbsent(c, 0);
map.computeIfPresent(c, (key,val)->val+1);
};
List<Character> keys = new ArrayList<>();
List<Integer> values = new ArrayList<>();
for (char i : map.keySet()) keys.add(i);
for (int i : map.values()) values.add(i);
Set<Set<Character>> setSet = new HashSet<>();
for (int i=0; i<values.size(); i++) {
for (int j=0; j<values.size(); j++) {
if (Math.abs(values.get(j)-values.get(i)) <= 1) {
Set<Character> set = new HashSet<>();
set.add(keys.get(i));
set.add(keys.get(j));
if (set.size() == 2) setSet.add(set);
}
}
}
List<Integer> resultList = new ArrayList<>();
for (Set<Character> set : setSet) {
boolean isAlternate = true;
List<Character> characters = new ArrayList<>();
char before = ' ';
for (char c : s.toCharArray()) {
if (set.contains(c)) {
if (before == c) isAlternate = false;
characters.add(c);
before = c;
}
}
if (isAlternate) resultList.add(characters.size());
}
Collections.sort(resultList, Comparator.reverseOrder());
return resultList.size() != 0 ? resultList.get(0) : 0;
}
}
'Algorithm > Hackerrank' 카테고리의 다른 글
[Hackerrank] Number Line Jumps (Easy) (0) | 2020.10.23 |
---|---|
[Hackerrank] Sub-array Division (Easy) (0) | 2020.10.23 |
[Hackerrank] Weighted Uniform Strings (Easy) (0) | 2020.10.22 |
[Hackerrank] Two Strings (Easy) (0) | 2020.10.21 |
[Hackerrank] Sherlock and the Valid String (Medium) (0) | 2020.10.18 |
댓글