https://programmers.co.kr/learn/courses/30/lessons/67258?language=java
๋ฌธ์ ์ ๋ฆฌ
1. ์ง์ด๋ ๋ชจ๋ ์ข ๋ฅ์ ๋ณด์์ ์ ์ด๋ 1๊ฐ ์ด์ ํฌํจํ๋ ๊ฐ์ฅ ์งง์ ์ฐ์๋ ๊ตฌ๊ฐ์ ๊ตฌํ์ธ์.
2. ๋ง์ฝ ๊ฐ์ฅ ์งง์ ์ฐ์๋ ๊ตฌ๊ฐ์ด ์ฌ๋ฌ๊ฐ๋ผ๋ฉด, ๊ฐ์ฅ ์ผ์ชฝ์ ์์นํ ๊ตฌ๊ฐ์ ๋ฐํํ์ธ์.
3. ์ง์ด๋ ๋ชจ๋ ์ข ๋ฅ์ ๋ณด์์ ์ ์ด๋ 1๊ฐ ์ด์ ํฌํจํ๋ ๊ตฌ๊ฐ์ ๋ฌด์กฐ๊ฑด 1๊ฐ ์ด์ ์กด์ฌํฉ๋๋ค.
์ ๊ทผ ๋ฐฉ๋ฒ
์์ ํ์
์ด ๋ฌธ์ ๋ ์ฐ์ ์ ํ๋ ํ๊ฐ์ ํจ์จ์ฑ ํ๊ฐ๊ฐ ์กด์ฌํ๋ค. ํจ์จ์ฑ ํ๊ฐ๊ฐ ์กด์ฌํ๋ค๋ฉด ๋ณดํต ์์ ํ์์ ์ด์ฉํ๋ฉด ์ ๋ ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ์๋ฏธํ๋ค๊ณ ๋ณผ ์ ์๋ค. ๋ง์ฝ์ ์์ ํ์์ ์ด์ฉํ์ฌ ๋ชจ๋ ๊ตฌ๊ฐ์ ํ์ํ์ฌ ๊ฐ์ฅ ์งง์ ๊ตฌ๊ฐ์ ๊ตฌํ๋ค๋ฉด ๋ณด์์ ๊ฐ์๊ฐ ์ต๋ 100,000๊ฐ ์ด๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ ๋๋ต 100,000 * 100,000๋ฒ loop๋ฅผ ์ํํด์ผ ํ๋ค. ์ฆ, ์์ ํ์์ผ๋ก ๊ตฌํ ํด๋ดค์ ์ ๋๋ก ํจ์จ์ฑ ํ๊ฐ๋ฅผ ํต๊ณผํ ์ ์๋ค.
์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ (์คํจ)
์ฒซ๋ฒ์งธ ์๊ฐํด๋ธ ๋ฐฉ๋ฒ์ ์ ํ๋ ํ๊ฐ์์ ์ฒ์ฐธํ ์คํจํ ๋ฐฉ๋ฒ์ด๋ค. ๋์ถฉ ๋ก์ง์ ์ค๋ช ํ์๋ฉด
1. ๋ชจ๋ ๋ณด์์ ๊ฐ์๋ฅผ ์นด์ดํธํ์ฌ HashMap<๋ณด์ ์ด๋ฆ, ๊ฐ์> gemsMap์ ์ด๊ธฐํ ํ๋ค.
2. ์๋ถํฐ ๋ณด์์ ํ๋์ฉ ์ ์ธํ๋ฉฐ ๋ง์ฝ ์ ์ธ๊ฐ ๋ถ๊ฐ๋ฅ(์ ์ธํ๋ฉด ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์ ๊ฒฝ์ฐ)ํ ๊ฒฝ์ฐ ๋ฃจํ๋ฅผ ์ข ๋ฃํ๋ค.
3. ๋ค๋ถํฐ ๋ณด์์ ํ๋์ฉ ์ ์ธํ๋ฉฐ ๋ง์ฝ ์ ์ธ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ฃจํ๋ฅผ ์ข ๋ฃํ๋ค.
4. 2,3๋ฒ ๋ก์ง์ ๊ฑฐ๊พธ๋ก ๋ฐ๋ณตํ๋ค. (๋ค->์, ์->๋ค ์)
5. 2,3,4๋ฒ ๋จ๊ณ๋ฅผ ํตํด ์ป์ด๋ธ ๋ ๊ฐ์ง์ ํด๋ต์ ๊ธธ์ด๋ฅผ ๋น๊ตํ๋ค.
5-1. ๋ง์ฝ ๊ธธ์ด๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ ๊ธธ์ด๊ฐ ์งง์ ํด๋ต์ ๋ฐํํ๋ค.
5-2. ๋ง์ฝ ๊ฐ์ ๊ฒฝ์ฐ ๋ ์์ ์์นํ ๊ตฌ๊ฐ์ ํด๋ต์ ๋ฐํํ๋ค.
๋ฑ ๋ณด๊ธฐ์ "์ด? ์ ์๋ ๊น? ์ฐ์๋ ๊ตฌ๊ฐ์ด๋๊น ์์ ๋ก์ง์ ์ ์ฉํ๋ค๋ฉด ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ํ์ํ๋ ๊ฒ๊ณผ ๊ฐ์ง ์์๊น?"๋ผ๊ณ ์๊ฐ ํ ์๋ ์๋ค. ํ์ง๋ง ์ ๋ก์ง์๋ ์์ฃผ ์น๋ช ์ ์ธ ๊ตฌ๋ฉ์ด ์กด์ฌํ๋ค.
๋ง์ฝ์ "A", "B" ,"B", "C", "A", "B", "C", "A", "B", "C" ์ ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ ์ฉํ๋ค๋ฉด 2,3๋ฒ ๋ก์ง์ ์งํํ ๊ฒฝ์ฐ
๋งจ ์์ด 1๋ฒ์งธ๋ผ๊ณ ํ ๋ [8, 10]๋ฅผ ๋ฐํํ๊ณ , 4๋ฒ ๋ก์ง์ ์งํํ ๊ฒฝ์ฐ [1,4]๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ผ ๊ฒฐ๊ตญ ์ ๋ต์ผ๋ก ๊ธธ์ด๊ฐ ์งง์ [8,10]์ ๋ฐํํ๊ฒ ๋๋ค. ํ์ง๋ง ์ ํ ์คํธ ์ผ์ด์ค์ ์ ๋ต์ [3,5]์ด๋ค. ์ ์ด์ ์์ ๋ก์ง์ ๋งจ ์, ๋งจ ๋ค์ ์์นํ ํด๋ต๋ง ์ฐพ์๊ฐ๋ ๋ก์ง์ธ ๊ฒ์ด๋ค. ๋ก!
๋๋ฒ์งธ ๋ฐฉ๋ฒ (์ฑ๊ณต)
๋๋ฒ์งธ๋ก ์๊ฐํด๋ธ ๋ฐฉ๋ฒ์ ์ ํ๋ ํ๊ฐ, ํจ์จ์ฑ ํ๊ฐ ๋ชจ๋ ์๋ฒฝํ๊ฒ ์ฑ๊ณตํ ๋ฐฉ๋ฒ์ด๋ค. ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
1. left, right๋ฅผ ์ด์ฉํ์ฌ ๊ตฌ๊ฐ์ ์ง์ ํ๋ค.
2. ๋ง์ฝ์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํ๋ ๊ตฌ๊ฐ์ด๋ฉด ๋ค์ ์์นํ ๋ณด์์ ํ๋ ๋ ์ ํํ๋ค. (right + 1)
3. ๋ง์ฝ์ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๊ตฌ๊ฐ์ด๋ฉด left์ ์์นํ ๋ณด์์ ์ ์ธ์์ผ ์กฐ๊ฑด์ ์ถฉ์กฑํ ์ ์๋์ง ํ์ธํ๋ค.
3-1. ๋ง์ฝ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ค๋ฉด left์ ์์นํ ๋ณด์์ ์ ์ธ์ํจ๋ค. (left + 1)
3-2. ๋ง์ฝ ์กฐ๊ฑด์ ์ถฉ์กฑํ์ง ๋ชปํ๋ค๋ฉด ๋ค์ ์์ฐจํ ๋ณด์์ ํ๋ ๋ ์ ํํ๋ค. (right + 1)
๋๋ฒ์งธ๋ก ์๊ฐํด๋ธ ๋ก์ง์ left, right ๋ ๋ณ์๋ฅผ ์ด์ฉํ์ฌ ๊ตฌ๊ฐ์ ์ง์ ํ์ฌ ๋ง์ฝ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๊ตฌ๊ฐ์ด๋ฉด ์ค์ผ ์ ์๋ ๋๋ก ์ต๋ํ ์ค์ด๊ณ , ์กฐ๊ฑด์ ์ถฉ์กฑํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ฉด ๋ณด์์ ํ๋ ๋ ์ ํํ์ฌ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋๋ก ๋๋ ค๊ฐ๋ ๋ก์ง์ด๋ค. ์์ ๋ก์ง์ ๋ํด ์ข ๋ ์์ธํ ์๊ณ ์ถ๋ค๋ฉด "ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ"์ ๋ํด์ ๊ณต๋ถํ๋ฉด ๋๋ค!
๊ตฌํ
import java.util.HashMap;
import java.util.Comparator;
import java.util.HashMap;
import java.util.PriorityQueue;
class Solution {
public int[] solution(String[] gems) {
int left = 0, right = 0, min = 654321;
int kinds = getKindsByGems(gems);
HashMap<String, Integer> gemsMap = new HashMap<>();
PriorityQueue<int[]> areas = new PriorityQueue<>(Comparator.comparingInt(o -> o[0]));
gemsMap.put(gems[0], 1);
while(right < gems.length) {
if(gemsMap.size() == kinds && min > (right - left)) {
min = right - left;
areas.clear();
areas.add(new int[] {left + 1, right + 1});
}
if(gemsMap.size() == kinds && gemsMap.get(gems[left]) > 1) {
gemsMap.put(gems[left], gemsMap.get(gems[left]) - 1);
left += 1;
}
else {
right += 1;
if(right < gems.length) gemsMap.put(gems[right], gemsMap.getOrDefault(gems[right], 0) + 1);
}
}
return areas.peek();
}
private Integer getKindsByGems(String[] gems) {
HashMap<String, Integer> gemsMap = new HashMap<>();
for (String gem : gems) {
gemsMap.put(gem, gemsMap.getOrDefault(gem, 0) + 1);
}
return gemsMap.size();
}
}
๋ฐ์ฑํ ์
์ด๋ป๊ฒ ๋ณด๋ฉด ์ ๋ง ์ฝ๊ฒ ํ ์ ์๋ ๋ฌธ์ ์๋ค. ์ฒซ๋ฒ์งธ ํ์ด ๋ฒ์ ์๊ฐํ ํ์ ์๋ชป๋ ๊ฒ์ด๋ผ๊ณ ํ๋จํ์ฌ ๋น ๋ฅด๊ฒ ๋๋ฒ์งธ ํ์ด ๋ฒ์ ๋ ์ฌ๋ ธ๋ค. ํ์ง๋ง ์๊ฐ๋ณด๋ค ํ์ด๊ฐ ์ค๋ ๊ฑธ๋ ธ๋ค. ์ด์ ๋ ์์ ๋ถํฐ ์กด์ฌํ๋ ๋์ ๊ณ ์ง๋ณ์ธ "ํ๋ฅ์ง๋ฅ" ๋๋ฌธ์ด์๋ค. ๋ก์ง์ ํ์คํ๊ฒ ์ค๊ณํ ํ์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋๋ฐ ํ์ด ๋ฐฉ๋ฒ์ ๋ ์ฌ๋ ธ๋ค๊ณ ๋ฌด์์ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ณด๋ ๊ตฌํ์ ์๊ฐ๋ณด๋ค ๋ง์ ์๊ฐ์ด ์์๋์๋ค.
๋ค์๋ถํฐ๋ ํ์คํ๊ฒ ๋ก์ง์ ์ค๊ณํ ํ์ ์ฝ๋๋ก ์ฎ๊ธฐ์! ์ ๋ฐ!