반응형
문제
https://leetcode.com/problems/partition-labels/
문제 해설
- 문제는 같은 단어는 무조건 같은 블록으로 보면서 여러 블록으로 나누는 수가 가장 많은 방법을 찾는 것이었다.
- ex) ABBAC => 2개(ABBA, C)
- 왜냐하면 A라는 글자는 한 블록안에 있어야하므로 마지막 A가 나올때까지는 무조건 한블럭으로 본다.
- ex) ABCAC => 1개(ABCAC)
- 왜냐하면 A라는 글자만 보면 마지막 A가 나오는 ABCA까지를 한블록 후보자로 볼 수 있는데 그 사이에 B,C가 있으므로 마지막 B,C가 나오는데까지를 한 블록으로 봐야한다. 따라서 ABCAC가 한 블록이고 리턴은 1개가 된다.
- ex) ABBAC => 2개(ABBA, C)
문제 풀기 전
- (문제이해를 잘못한 상태) 가장 많은 글자를 포함하되 가장 많이 쪼개라 글자의 갯수>= 2
- (문제이해를 잘못한 상태) 문제를 쪼개서 서브 문제로 만들 수 있지 않을까.
- (문제이해를 잘못한 상태) brute force로 해볼까.
- 문제를 잘못 파악했구나..
- start,end를 잡아서 어떻게 하면 되겠다는 방법만 알았는데 풀지를 못했다.
직접 푼 풀이
소요시간: 70분(20:53 ~ 10:03)
못풀었다. 재도전하기!
느낀점
- Greedy방법으로 풀 수 있음을 알게 되었다.
- 구간들의 확장에 대한 문제를 풀때 greedy를 이용해야겠다. 여러 구간의 확장을 어떻게 시킬지 방법을 몰랐는데 마지막 지점을 저장해두고 나서 기준값을 마지막구간값으로 Math.max로 업데이트하고 현재 인덱스와 그 값이 같을때를 한 구간으로 본다는 식으로 풀면된다.
- easy풀다가 medium넘어가니 바로 막히는게 참 신기하였다. 내공이 많이 필요하다.
솔루션 공부 후 추가로 푼 풀이
#Greedy
class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer> ret = new ArrayList<>();
int[] alphabets = new int[26];
for(int i=0; i<S.length(); i++) {
int letter = (int)(S.charAt(i)-'a');
alphabets[letter]=i;
}
int far = 0;
int start = 0;
for (int i=0; i<S.length(); i++) {
int letter = (int)(S.charAt(i)-'a');
far = Math.max(alphabets[letter], far);
if (far == i) {
int distance = far - start +1;
start = far + 1;
ret.add(distance);
}
}
if (start != S.length()) {
ret.add(S.length() - start);
}
return ret;
}
}
누적되는 알고리즘 접근 설명서
'알고리즘 풀이' 카테고리의 다른 글
.leetcode(406. Queue Reconstruction by Height) (0) | 2021.01.14 |
---|---|
.leetcode(338. Counting Bits) (0) | 2021.01.14 |
.leetcode(20. Valid Parentheses) (0) | 2021.01.13 |
.leetcode(155. Min Stack) (0) | 2021.01.09 |
.leetcode(53. Maximum Subarray) (0) | 2021.01.09 |