문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
가중 문자열은 각 문자에 가중치가 할당된 영어 소문자이다. 문자의 가중치는 아래와 같이 a부터 z까지 1부터 26까지이다.
문자열의 가중치는 각 문자의 가중치의 합이다.
유니폼 문자열은 하나의 문자가 0회 이상 반복된다. 예를 들어, ccc와 a는 유니폼 문자열이지만, bcb와 cd는 아니다.
문자열 s가 주어지고, U를 문자열 s의 모든 가능한 균일한 연속 부분 문자열의 가중치 집합이라고 한다. 각각의 쿼리는 하나의 정수로 이루어져 있으며, n개의 쿼리에 대한 답변을 제공해야 한다. 각 쿼리에 대해 반환 배열을 만들어라. 만약 query[i]가 U에 포함된다면 YES, 그렇지 않으면 NO를 나타내라.
s = 'abbcccdddd'
queries = [1, 7, 5, 4, 15]
string | weight |
---|---|
a | 1 |
b | 2 |
bb | 4 |
c | 3 |
cc | 6 |
ccc | 9 |
d | 4 |
dd | 8 |
ddd | 12 |
dddd | 16 |
이제 각 쿼리의 값에 대해 가능한 문자열 가중치 중에 존재하는지 확인한다. 반환 배열은 ['Yes', 'No', 'No', 'Yes', 'No']가 된다.
weightedUniformStrings 함수를 완성해라.
weightedUniformStrings 함수는 아래와 같은 매개변수를 가지고 있다.
주어진 문자열 s가 예제를 보면 알파벳 순으로 되어있지만 테스트 케이스를 보면 전혀 그렇지 않다. 이 부분을 유의해서 해결해야 한다.
문자열 s를 캐릭터 배열로 바꾼다. 그리고 부분 문자열의 가중치를 담을 정수형 리스트를 생성한다. 여기서 temp라는 변수를 사용해서 첫번째 글자의 가중치를 담고, count 변수에 1을 할당한다. 그리고 temp와 count를 곱한 값을 정수형 리스트에 추가한다.
char[] sArr = s.toCharArray();
List<Integer> intArr = new ArrayList<>();
int temp = sArr[0] - 'a' + 1;
int count = 1;
intArr.add(temp * count);
for문을 통해 부분 문자열의 가중치를 전부 계산해 준다. 이때 같은 문자가 나왔을 때 가중치를 계산해서 intArr에 추가한다. 다른 문자가 있을 경우 count에 1을 할당하고 새로운 문자에 대한 가중치를 intArr에 추가한다.
for(int i = 1; i < sArr.length; i++){
temp = sArr[i] - 'a' + 1;
if(sArr[i] == sArr[i - 1]){
count++;
}else{
count = 1;
}
intArr.add(temp * count);
}
반환시킬 문자열 리스트 result를 생성한다. 그리고 for문을 통해 queries의 요소가 intArr에 있는지 확인하고 Yes 또는 No를 result에 추가한다. 마지막에 result를 반환한다.
for(int i = 0; i < queries.size(); i++){
if(intArr.indexOf(queries.get(i)) != -1){
result.add("Yes");
}else{
result.add("No");
}
}
return result;
public static List<String> weightedUniformStrings(String s, List<Integer> queries) {
char[] sArr = s.toCharArray();
List<Integer> intArr = new ArrayList<>();
int temp = sArr[0] - 'a' + 1;
int count = 1;
intArr.add(temp * count);
for(int i = 1; i < sArr.length; i++){
temp = sArr[i] - 'a' + 1;
if(sArr[i] == sArr[i - 1]){
count++;
}else{
count = 1;
}
intArr.add(temp * count);
}
List<String> result = new ArrayList<>();
for(int i = 0; i < queries.size(); i++){
if(intArr.indexOf(queries.get(i)) != -1){
result.add("Yes");
}else{
result.add("No");
}
}
return result;
}