
-Code
import java.util.*;
class Solution {
public int solution(String message, int[][] spoiler_ranges) {
// 시크릿 문자들 저장
int curIdx = 0;
List<String> spoilerWords = new ArrayList<>();
Set<String> noSpoilerWords = new HashSet<>();
for (String word : message.split(" ")) {
// 단어를 검사하고 시작할 위치를 해당 단어 뒤로 지정
// 똑같은 단어 나올때를 방지
int start = message.indexOf(word, curIdx);
int end = start + word.length() - 1;
curIdx = end + 1;
// 스포일러 범위에 조금이라도 걸치면 스포일러 단어에 저장
boolean isSpoiler = false;
for (int[] range: spoiler_ranges) {
if (start <= range[1] && end >= range[0]) {
spoilerWords.add(word);
isSpoiler = true;
break;
}
}
// 스포일러 단어가 아니면 아닌 단어들에 저장
if (!isSpoiler) {
noSpoilerWords.add(word);
}
}
// 중요한 단어인지 확인
Set<String> importantWords = new HashSet<>();
for (String spoilerWord : spoilerWords) {
// 중요한 단어에 이미 포함되지 않고
// 스포일러가 아닌 단어에 포함되지 않으면 중요한 단어
if (!importantWords.contains(spoilerWord) &&
!noSpoilerWords.contains(spoilerWord)) {
importantWords.add(spoilerWord);
}
}
return importantWords.size();
}
}
처음에 단어 단위로 하지 않고 구간 단위로 계산을 하려고 해서 틀렸습니다. 그래서 내가 잘못 이해하고 있는 부분을 보니 가려진 부분이 포함된 단어를 기준으로 찾는 것이어서 해당 범위에 조금이라도 겹치면 해당 단어는 스포일러 단어로 리스트에 저장하면서 풀려했습니다.
하지만 이 방법으로 해결하려 하니 message를 기반으로 String을 작성하면서 작성해보니 복잡해져 로직이 꼬이게 되어 로직을 풀 시작점을 찾아보니, 스포일러가 아닌 단어를 따로 같이 저장하여해 보라는 힌트를 얻게 되었고 이를 통해 위와 같이 해결했습니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [프로그래머스/Java] 유연근무제 (0) | 2026.03.23 |
|---|---|
| [백준/Java] 12021번 보물 찾기 (0) | 2026.03.23 |
| [백준/Java] 6857번 Cell-Phone Messaging (0) | 2026.03.22 |
| [프로그래머스/Java] 노란불 신호등 (0) | 2026.03.22 |
| [백준/Java] 34991번 toycppartoon (0) | 2026.03.21 |