본문 바로가기
Algorithm/Hackerrank

[Hackerrank] Two Characters (Easy)

by 잭피 2020. 10. 21.

[Hackerrank] Sherlock and the Valid String - (String - Easy)

www.hackerrank.com/challenges/two-characters/problem

 

Two Characters | HackerRank

Print the length of the longest possible string $t$ you can form.

www.hackerrank.com


문제

문자열 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;
    }
 }

댓글