https://programmers.co.kr/learn/courses/30/lessons/67258
๋ฌธ์ ์ค๋ช
๊ฐ๋ฐ์ ์ถ์ ์ผ๋ก ์ธ๊ณ ์ต๊ณ ์ ๊ฐ๋ถ๊ฐ ๋ ์ดํผ์น๋ ์คํธ๋ ์ค๋ฅผ ๋ฐ์ ๋๋ฉด ์ด๋ฅผ ํ๊ธฐ ์ํด ์คํ๋ผ์ธ ๋งค์ฅ์ ์ผํ์ ํ๋ฌ ๊ฐ๊ณค ํฉ๋๋ค.
์ดํผ์น๋ ์ผํ์ ํ ๋๋ฉด ๋งค์ฅ ์ง์ด๋์ ํน์ ๋ฒ์์ ๋ฌผ๊ฑด๋ค์ ๋ชจ๋ ์น์ธ์ด ๊ตฌ๋งคํ๋ ์ต๊ด์ด ์์ต๋๋ค.
์ด๋ ๋ ์คํธ๋ ์ค๋ฅผ ํ๊ธฐ ์ํด ๋ณด์ ๋งค์ฅ์ ์ผํ์ ํ๋ฌ ๊ฐ ์ดํผ์น๋ ์ด์ ์ฒ๋ผ ์ง์ด๋์ ํน์ ๋ฒ์์ ๋ณด์์ ๋ชจ๋ ๊ตฌ๋งคํ๋ ํน๋ณํ ์๋ ๋ชฉ์ ์ ๋ฌ์ฑํ๊ณ ์ถ์์ต๋๋ค.
์ง์ด๋ ๋ชจ๋ ์ข
๋ฅ์ ๋ณด์์ ์ ์ด๋ 1๊ฐ ์ด์ ํฌํจํ๋ ๊ฐ์ฅ ์งง์ ๊ตฌ๊ฐ์ ์ฐพ์์ ๊ตฌ๋งค
์๋ฅผ ๋ค์ด ์๋ ์ง์ด๋๋ 4์ข ๋ฅ์ ๋ณด์(RUBY, DIA, EMERALD, SAPPHIRE) 8๊ฐ๊ฐ ์ง์ด๋ ์์์ ๋๋ค.
์ง์ด๋ ๋ฒํธ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
๋ณด์ ์ด๋ฆ | DIA | RUBY | RUBY | DIA | DIA | EMERALD | SAPPHIRE | DIA |
์ง์ด๋์ 3๋ฒ๋ถํฐ 7๋ฒ๊น์ง 5๊ฐ์ ๋ณด์์ ๊ตฌ๋งคํ๋ฉด ๋ชจ๋ ์ข ๋ฅ์ ๋ณด์์ ์ ์ด๋ ํ๋ ์ด์์ฉ ํฌํจํ๊ฒ ๋ฉ๋๋ค.
์ง์ด๋์ 3, 4, 6, 7๋ฒ์ ๋ณด์๋ง ๊ตฌ๋งคํ๋ ๊ฒ์ ์ค๊ฐ์ ํน์ ๊ตฌ๊ฐ(5๋ฒ)์ด ๋น ์ง๊ฒ ๋๋ฏ๋ก ์ดํผ์น์ ์ผํ ์ต๊ด์ ๋ง์ง ์์ต๋๋ค.
์ง์ด๋ ๋ฒํธ ์์๋๋ก ๋ณด์๋ค์ ์ด๋ฆ์ด ์ ์ฅ๋ ๋ฐฐ์ด gems๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ์ด๋ ๋ชจ๋ ๋ณด์์ ํ๋ ์ด์ ํฌํจํ๋ ๊ฐ์ฅ ์งง์ ๊ตฌ๊ฐ์ ์ฐพ์์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
๊ฐ์ฅ ์งง์ ๊ตฌ๊ฐ์ ์์ ์ง์ด๋ ๋ฒํธ์ ๋ ์ง์ด๋ ๋ฒํธ๋ฅผ ์ฐจ๋ก๋๋ก ๋ฐฐ์ด์ ๋ด์์ return ํ๋๋ก ํ๋ฉฐ, ๋ง์ฝ ๊ฐ์ฅ ์งง์ ๊ตฌ๊ฐ์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ์์ ์ง์ด๋ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ๊ตฌ๊ฐ์ return ํฉ๋๋ค.
์ ํ ์ฌํญ
- gems ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 1 ์ด์ 100,000 ์ดํ์
๋๋ค.
- gems ๋ฐฐ์ด์ ๊ฐ ์์๋ ์ง์ด๋์ ๋์ด๋ ๋ณด์์ ๋ํ๋ ๋๋ค.
- gems ๋ฐฐ์ด์๋ 1๋ฒ ์ง์ด๋๋ถํฐ ์ง์ด๋ ๋ฒํธ ์์๋๋ก ๋ณด์์ด๋ฆ์ด ์ฐจ๋ก๋๋ก ์ ์ฅ๋์ด ์์ต๋๋ค.
- gems ๋ฐฐ์ด์ ๊ฐ ์์๋ ๊ธธ์ด๊ฐ 1 ์ด์ 10 ์ดํ์ธ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ๊ตฌ์ฑ๋ ๋ฌธ์์ด์ ๋๋ค.
ํ์ด
HashSet
: ๋ณด์์ ์ข
๋ฅ
HashMap
: ์ ํํ ๊ตฌ๊ฐ๋ด์ ๋ณด์ ์ข
๋ฅ๋ณ ๊ฐฏ์
Queue
: ์ ํํ ๊ตฌ๊ฐ์ ๋ณด์๋ค์ ์ด๋ฆ
1๏ธโฃ ) gems๋ฅผ for๋ฌธ์ผ๋ก ๋๋ฉด์ queue ์ ์ถ๊ฐ
2๏ธโฃ ) queue์ peek ๋ณด์ ๊ตฌ๊ฐ๋ด์ ์ฒซ๋ฒ์งธ ๋ณด์
์ด ๋๊ฐ ์ด์ ์กด์ฌํ๋ฉด ๊ตฌ๊ฐ์์ ์ ๊ฑฐ & ์์์ง์ + 1
3๏ธโฃ ) set.size() == map.size() ๋ฉด, ๋ชจ๋ ์ข ๋ฅ์ ๋ณด์์ ๋ด์๋ค๋ ์๋ฏธโผ๏ธ
- ํ์ฌ queue์ ํฌ๊ธฐ๊ฐ len ๋ณด๋ค ์์ผ๋ฉด ์ต์ข ์ ๋ต ์์ ์ง์ ๊ณผ ๊ตฌ๊ฐ ๊ธธ์ด ์ ๋ฐ์ดํธ
์ฝ๋
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
public class ๋ณด์์ผํ {
public static int[] solution(String[] gems) {
Set<String> jewel = new HashSet<>(Arrays.asList(gems)); // ๋ณด์์ ์ข
๋ฅ
Map<String, Integer> jewelMap = new HashMap<>(); // ๋ณด์ ์ข
๋ฅ๋ณ ๊ฐฏ์
Queue<String> interval = new LinkedList<>();
int len = Integer.MAX_VALUE;
int startPoint = 0, answerStartPoint = 0;
for(int i = 0 ; i < gems.length; i++){
String gemName = gems[i];
jewelMap.put(gemName, jewelMap.getOrDefault(gemName, 0)+1);
interval.offer(gemName);
while(true){
String firstGem = interval.peek();
// ์ฒซ๋ฒ์งธ ๋ณด์์ด ๊ตฌ๊ฐ์์ ๋ ์๋ ๊ฒฝ์ฐ
if(jewelMap.get(firstGem) > 1){
// ์ฒซ๋ฒ์งธ ๋ณด์ ์ ๊ฑฐ
jewelMap.put(firstGem, jewelMap.get(firstGem)-1);
interval.poll();
startPoint++;
}
else
break;
}
if(jewel.size() == jewelMap.size() && len > interval.size()){
len = interval.size();
answerStartPoint = startPoint;
}
}
return new int[]{answerStartPoint+1, answerStartPoint + len};
}
public static void main(String[] args) {
String[] gems = {"DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"};
int[] answer = solution(gems);
for(int a : answer){
System.out.println(a);
}
}
}
'์๊ณ ๋ฆฌ์ฆ > ํ๋ก๊ทธ๋๋จธ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ํ๋ก๊ทธ๋๋จธ์ค / Programmers Level 3 ] 2 X n ํ์ผ๋ง (0) | 2021.09.28 |
---|---|
[ ํ๋ก๊ทธ๋๋จธ์ค / Programmers Level 3 ] ๋ถ๋ ์ฌ์ฉ์ (0) | 2021.09.28 |
[ ํ๋ก๊ทธ๋๋จธ์ค / Programmers Level 3 ] ํ ํธ์ง (0) | 2021.09.23 |
[ ํ๋ก๊ทธ๋๋จธ์ค / Programmers Level 3 ] ์ ํ ๋ฒ์ค (0) | 2021.09.21 |
[ ํ๋ก๊ทธ๋๋จธ์ค / Programmers Level 3 ] ๋ค๋จ๊ณ ์นซ์ ํ๋งค (0) | 2021.09.20 |