본문 바로가기
Algorithm/Hackerrank

[Hackerrank] Weighted Uniform Strings (Easy)

by 잭피 2020. 10. 22.

[Hackerrank] Weighted Uniform Strings - (String - Easy)

www.hackerrank.com/challenges/weighted-uniform-string/problem

 

Weighted Uniform Strings | HackerRank

Determine if a string contains uniform substrings of certain weights.

www.hackerrank.com


문제

String s와 int 배열 queries가 주어진다

그리고 queries의 숫자들이 문자열 s로 나타낼 수 있는 숫자면 YES, 아니면 NO를 출력

문자열 s가 나타내는 숫자는 a=1 ~ z=26으로 표현하는데,

예를들어 abccddde의 경우 각 문자열과 연속되는 문자열을 숫자로 표현할 수 있다

a=1, b=2, c=3, cc=3+3, d=4, dd=4+4, ddd=4+4+4, e=5

1,2,3,4,5,6,8,12를 나타낼 수 있다 

해결

Map에 a~z까지 1~26을 넣어둔다

Set을 만들고,

이전 문자랑 같으면 beforSum에 숫자를 더하고 Set에 추가,

같지 않으면 그냥 set에 숫자를 추가하고 beforSum을 현재 숫자로 초기화

그리고 최종적으로 queries에 있는 숫자가 set에 있으면 Yes 아니면 No를 출력

static String[] weightedUniformStrings(String s, int[] queries) {
    int a = 97;
    int z = 122;
    Map<Character, Integer> map = new HashMap<>();
    for (int i=a; i<=z; i++) map.put((char)i, i-96);

    Set<Integer> set = new HashSet<>();
    char befor = ' ';
    int beforSum = 0;
    for (char c : s.toCharArray()) {
        if(befor == c) {
            beforSum += map.get(c);
            set.add(beforSum);
        } else {
            set.add(map.get(c));
            beforSum = map.get(c);
            befor = c;
        }
    }

    String[] strArr = new String[queries.length];

    for (int i=0; i<queries.length ; i++) {
        if (set.contains(queries[i])) {
            strArr[i] = "Yes";
        } else {
            strArr[i] = "No";
        }
    }

    return strArr;
}

댓글