Algorithm/Programmers
[Java] ํ๋ก๊ทธ๋๋จธ์ค - ๋ณด์ ์ผํ
๊ฐ๋ฐ๊ฐ๊ตด๐ธ
2022. 7. 3. 19:32
[๋ฌธ์ ]
https://programmers.co.kr/learn/courses/30/lessons/67258
์ฝ๋ฉํ ์คํธ ์ฐ์ต - ๋ณด์ ์ผํ
["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7]
programmers.co.kr


[ํ์ด]
ํฌํฌ์ธํฐ ๋ฐฉ์์ผ๋ก ๋ฐฐ์ด์ ํ์ํ๋ ๋ฐฉ๋ฒ์ด ํต์ฌ์ธ ๋ฌธ์ ์์ต๋๋ค.
์ฐ์ , ์ด๊ธฐ์ ํ์ํ ์๋ฃ๋ฅผ ์ธํ ํ์์ต๋๋ค.
- Set<String> set์ผ๋ก ๋ณด์์ ๊ฐ์๋ฅผ ์ ์ฅํ์์ต๋๋ค.
- gems๋ฅผ ํ์ํ์ฌ Map<String, Integer> pick์ ๊ฐ ๋ณด์์ ๊ฐ์๋ฅผ ์ ์ฅํ๋ฉฐ ๋งจ์์์ ๊ตฌํ ์ ์๋ ๋ณด์์ธํธ๋ฅผ ์ ์ฅํด์ ์ด๊ธฐ start์ end๋ฅผ ์ ์ฅํ์์ต๋๋ค.
๊ทธ๋ค์, ํฌํฌ์ธํฐ ๋ฐฉ์์ผ๋ก left๋ฅผ right๋ฅผ ๊ฐฑ์ ํ๋ฉฐ gems๋ฐฐ์ด์ ๋๊น์ง ์๋ก์ด ๋ณด์์ธํธ๋ฅผ ๋ง๋ค์์ต๋๋ค.
- left = start, right = end๋ฅผ ์ ์ฅํ๊ณ , right < gems.length ๊น์ง ํ์
- right++ํตํด ์ค๋ฅธ์ชฝ์ผ๋ก ํ์นธ ํ์ฅํ๊ณ , left๋ถํฐ pick์์ ๋ณด์๊ฐ์๋ฅผ ๊ตฌํด์, ๊ฒน์น๋ ๋ณด์์ด ์๋ค๋ฉด ( ๋ณด์์ด 2๊ฐ ์ด์์ด๋ผ๋ฉด ) ๋ณด์์ ์ ๊ฑฐํ๋ฉฐ left++๋ฅผ ์งํํ์์ต๋๋ค.
์ฌ๊ธฐ์ ํต์ฌ์, ๊ฐ ๋ณด์์ด ์ต์ 1๊ฐ๋ ์์ด์ผ์ง ๋ณด์์ธํธ๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์, ๋ง์ฝ ํ์ฌ left๊ฐ ๊ฐ๋ฅดํค๋ ๋ณด์์ด pick์ 1๊ฐ๋ง ์กด์ฌํ๋ค๋ฉด, left ๊ฐฑ์ ์ ์ค๋จ๋ฉ๋๋ค.
[์ฝ๋]
import java.util.*;
class Solution {
public static int N = 0; // ์ค๋ณต ์ ๊ฑฐ๋ ๋ณด์์ ์ด ๊ฐ์
public static int start = 0;
public static int end = 0;
public int[] solution(String[] gems) {
int[] answer = new int[2];
// ๋ณด์์ ๊ฐ์ ๊ตฌํ๊ธฐ
Set<String> set = new HashSet<String>();
for(int i=0;i<gems.length;i++) {
set.add(gems[i]);
}
N = set.size();
Map<String, Integer> pick = new HashMap<String,Integer>();
for(int i=start;i<gems.length;i++) {
if(pick.get(gems[i]) == null) {
pick.put(gems[i], 1);
} else {
int cnt = pick.get(gems[i]) + 1;
pick.put(gems[i], pick.get(gems[i]) + 1);
}
if(pick.size() == N) {
end = i;
break;
}
}
for(int i=start;i<end;i++) {
if(pick.get(gems[i]) == 1) {
start = i;
break;
} else {
int cnt = pick.get(gems[i]) - 1;
pick.put(gems[i], cnt);
}
}
int left = start;
int right = end + 1;
while(right < gems.length) {
int cnt = pick.get(gems[right]) + 1;
pick.put(gems[right], cnt);
// ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ฅ
for(int i=left;i<=right;i++) {
cnt = pick.get(gems[i]);
if(cnt == 1) {
left = i;
break;
} else {
pick.put(gems[i], cnt - 1);
}
}
if((right - left) < (end - start)) {
start = left;
end = right;
}
right++;
}
answer[0] = start + 1;
answer[1] = end + 1;
return answer;
}
}