Iyoungman Back-end Developer

HackerRank. Sherlock and the Valid String


Problem

https://www.hackerrank.com/challenges/sherlock-and-valid-string/problem


Think

  • 다양한 상황을 고려해야하는 문제이다.
  • 문제를 읽고 조건에 맞게 Valid한 3가지 상황을 고려하여 풀었다.

1) 모든 Character의 Count가 같은 경우

ex) aabbcc -> a : 2, b : 2, c : 2

2) 한 Character만 Count가 다른데 해당 Count가 1일 경우

ex) abbbccc -> a : 1, b : 3, c : 3 // a만 지우면 된다.

아래의 경우는 안된다.

ex) aabbbccc -> a : 2, b : 3, c : 3

3) 한 Character만 Count가 다른데 해당 Count가 가장 클 경우

ex) aabbccc -> a : 2, b : 2, c : 3 // c를 하나 지우면 된다.

아래의 경우는 안된다.

ex) aabbcccc -> a : 2, b : 2, c : 4

  • 위 순서대로 검증을 하면 될것 같다.

  • 직접 해결한 문제.


Solved Code

// Complete the isValid function below.
static String isValid(String s) {
    char[] sArray = s.toCharArray();
    Map<Character, Integer> countMap = new HashMap();

    for(char c : sArray) {
        int value = countMap.getOrDefault(c, 0);
        countMap.put(c, value + 1);
    }

    List<Integer> values = new ArrayList<Integer>(countMap.values());
    Collections.sort(values);//(1)

    //(2)
    if(isAllSame(values)) {
        return "YES";
    }

    //(3)
    if(values.get(0) != values.get(1) && values.get(0) == 1) {
        values.set(0, 0);
        if(isAllSame(values)) {
            return "YES";
        }
        values.set(0, 1);
    }

    //(4)
    int length = values.size();
    if(values.get(length - 2) != values.get(length - 1)) {
        values.set(length - 1, values.get(length - 1) - 1);
        if(isAllSame(values)) {
            return "YES";
        }
    }

    return "NO";
}

private static boolean isAllSame(List<Integer> values) {
    boolean isResult = true;

    int first = values.get(0) == 0 ? values.get(1) : values.get(0);
    for(int value : values) {
        if(value == 0) {
            continue;
        }

        if(first != value) {
            isResult = false;
            break;
        }
    }

    return isResult;
}


Solved Process

1) 계산의 편의성을 위해 정렬을 했다.
2) Think의 1 과정이다.
3) Think의 2 과정이다.
4) Think의 3 과정이다.


Comments

Content