1. ๋ฌธ์ ์ค๋ช ๐
(1) ๋งํฌ๐
(2) ํด์ค๐ต
๋น์ ์๊ฒ integer ํํ์ ์ซ์ ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋๋ค. ๋น์ ์ ๋ฐฐ์ด์์ ์์๋ค์ด ์ค๋ณต์ด ์๋ค๋ ๊ฒ์ ๋ณด์ฅํ ํ์๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฌ์ฑํ๊ธฐ ์ํด, ๋น์ ์ ์ธ์ ๋ ๋ค์ ๋์์ ์ํํ ์ ์์ต๋๋ค.
- ๋ฐฐ์ด์ ์ฒซ 3๊ฐ์ง ์์๋ฅผ ์ญ์ ํ์ธ์. ๋ง์ฝ ๋ฐฐ์ด์ด 3๊ฐ๋ณด๋ค ๋ ์ ๊ฒ ์์๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋จ์์๋ ๋ชจ๋ ์์๋ฅผ ์ญ์ ํ์ญ์ผ.
๋น ๋ฐฐ์ด์ ์ค๋ณต์ด ์ ๊ฑฐ๋ ๋ฐฐ์ด์ด๋ผ๊ณ ์ฌ๊ฒจ์ง๋ค๋ ๊ฒ์ ์ฃผ์ํ์ธ์. ๋ฐฐ์ด ์ ์์์ ์ค๋ณต์ด ์ ๊ฑฐ๋๋๋ก ๋ง๋ค๊ธฐ ์ํด ํ์ํ ์ต์ํ์ ๋์ ํ์๋ฅผ ๋ฐํํ์ธ์.
2. ์๊ฐ์ ํ๋ฆ: ์ฝ๋๊ฐ ๋์ค๊ธฐ๊น์ง ๐๏ธ
(1) IDEA ๋์ถ๐ก
KEY WORD: HashMap์ ํ์ฉํ ๋จ์ ๊ตฌํ
์ค๋ณต๋ ๊ฐ์ ๊ฐ์ ๊ด๋ฆฌ๋ฅผ ํด์ผํ๋ค๋ ์ธก๋ฉด์์ HashMap์ด ์๊ฐ๋ฌ๋ค. ์ซ์์ ์ด ๊ฐ์๊ฐ 100์ ๋์ง ์๋๋ค๋ ๋ฉด์์ ํด๋น ๋ฌธ์ ๋ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ธ ์ ์๋๊ฐ๋ฅผ ๋ฌป๋ ๋ฌธ์ ์ด์ง, ์๊ฐ๋ณต์ก๋์ ๋ง๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌป๋ ๋ฌธ์ ๊ฐ ์๋์ ๋๊ผ๋ค.
๋ฌธ์ ์ ๋ํ ์์ด๋์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
a. HashMap ์ฑ์ฐ๊ธฐ

HashMap์ key๋ ์ซ์, value๋ ๊ทธ ์ซ์๊ฐ ๋์จ ํ์์ด๋ค. ์์ numsThatsMoreThan1์ ์์์ ์ซ์๊ฐ 2๋ฒ ์ด์ ๋ฑ์ฅํ๋ฉด cnt๋ฅผ +1 ์ฌ๋ฆฐ๋ค. ์ฌ๊ธฐ์๋ ์ต์ข
์ ์ผ๋ก numsThatsMoreThan1 = 2๊ฐ ๋ ๊ฒ์ด๋ค. ๋ณด๋ค์ํผ HashMap์ ์์ ์ญ์ ์ ๋ฐ๋ฅธ ์ซ์์ ๊ฐ์ ์ถ์ ์ฉ ํ
์ด๋ธ์ด๋ค.
b. 3๊ฐ์ฉ ์ง์ฐ๋ฉฐ ๋ฐฐ์ด์ด ์ค๋ณต ์๋ ๋ฐฐ์ด์ธ์ง ํ์ธ

3๊ฐ์ฉ ์ง์๊ฐ๋ฉฐ, HashMap๊ณผ numsThatsMoreThan1์ ์ค์ฌ๋๊ฐ๋ค. numsThatsMoreThan1์ ์์์ ์ซ์๊ฐ 1๊ฐ๋ฐ์ ์ ๋จ์์ ๋ ์ง์ฐ๋ฉด ๋๋ค.
c. ์ฌ์ฉํ ํจ์
ํด๋น ๊ณผ์ ์ HashMap์ GET ์ด๋ PUT์ผ๋ก๋ง ํ๋ค๋ฉด ์๋นํ ์ฝ๋๊ฐ ์ง์ ๋ถํด์ง ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ฒ ํ์ด์์๋ HashMap.compute(key, (key, oldvalue) -> remmaping Function)์ ํ์ฉํ๋ค.
compute(k, (k,ov)-> {return nv})๋ ํจ์์ ์ด๋ฆ๋ต๊ฒ HashMap ๋ด๋ถ์ ๊ฐ๋ค์ ์กฐ์ ํ๋ ํจ์์ด๋ค. ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ตฌ์ฑ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
k= key ๊ฐ,ov= ๊ธฐ์กด value ๊ฐ,nv= ๋๋ค์์ ๊ฑฐ์น ์๋ก์ด value ๊ฐ - ๋ง์ฝ key์ value๊ฐ hashMap์ ์กด์ฌํ์ง ์๋๋ค๋ฉด? : ๊ฑฑ์ ํ์ง ๋ง๋ผ. ์ด ๊ฒฝ์ฐ๋ ov = null๋ก ๊ฐ์ด ์ฐํ๋ค. ๋ฐ๋ผ์ ov = null์ผ ๊ฒฝ์ฐ, key๊ฐ ๊ธฐ์กด์ HashMap์ ๋ค์ด์๋ ๊ฐ์ด ์๋์ผ๋ก, ๊ทธ๊ฑธ ๊ฐ์ํด์ ์ฝ๋๋ฅผ ์ง๋ฉด ๋๋ค.
- 2๋ฒ์งธ ํจ์์ธ ๋๋คํจ์์์ return ํ๋ ๊ฐ์ด ํด๋น key์ new value ๋ก์จ HashMap์ ๋ฎ์ด์ฐ๊ธฐ ๋๋ค. ๋ง์ฝ key๋ ๊ธฐ์กด์ ์๋ ๊ฐ์ด์๋ค๋ฉด, ์๋ก์ด key-value ์์ด HashMap์ ์ถ๊ฐ ๋๋ ๊ฒ์ด๋ค.
- ๋ง์ฝ ๋๋คํจ์์ return ์ด null ๋ก ๋ง๋ ๋ค๋ฉด?: ์ด๊ฒ์ ํด๋น key๋ฅผ HashMap์์ ์ญ์ ํ๊ฒ ๋ค๋ ๋ป์ด๋ค. ์ฆ
map.remove(k)์ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ธ๋ค.
(2) SUDO CODE ๐
// 1. make hash map that has number as key, counts that number is appear as value
// 2. remove 3 elements from array
// 2-1 when I remove element, I should substract value with 1 in hashmap values
// 2-2 when all hashmap's key has only 1 value, finish minimumOperations function
์ธ๊ตญ์ธ๋ค์ด ๋ง์ด ์ฐ๋ ๋ฆฌํธ์ฝ๋๋ผ ์์ด๋ก ์จ๋ดค๋ค ใ
(3) ์๊ฐ๋ณต์ก๋ ๋ถ์ ๐
ํด๋น ๋ฌธ์ ๋ ์ฃผ์ด์ง ์ธ์์ ์ต๋ ํฌ๊ธฐ๋ก ๋ดค์ ๋, ์๊ฐ๋ณต์ก๋๋ฅผ ์ ๊ฒฝ ์ฐ์ง ์์๋ ๋๋ ๋ฌธ์ ์ด๋ค.
3. ๊ตฌํ ์ฝ๋ ๐
class Solution {
public int minimumOperations(int[] nums) {
// 1. make hash map that has number as key, counts that number is appear as value
// 2. remove 3 elements from array
// 2-1 when I remove element, I should substract value with 1 in hashmap values
// 2-2 when all hashmap's key has only 1 value, finish minimumOperations function
int numsThatsMoreThan1 = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++) {
int now =
map.compute(nums[i], (k,ov) -> {
if(ov == null) return 1;
else return ov+1;
});
if(now == 2) numsThatsMoreThan1++;
}
if(numsThatsMoreThan1 == 0) return 0;
int iter = 0;
int ans = 0;
while (iter < nums.length) {
int left = nums.length - iter;
for(int i = 0; i < Math.min(3, left); i++) {
int now = nums[iter++];
Integer flag = map.compute(now, (k,ov) -> {
if(ov == 1) return null;
else if(ov == 2) return 1;
else return ov-1;
});
if(flag != null && flag == 1) numsThatsMoreThan1--;
}
ans++;
if(numsThatsMoreThan1 == 0) return ans;
}
return ans;
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
HashMap์ compute๋ ํจ์๋ฅผ ์ค๋๋ง์ ์ฐ๋ฉฐ, ๊น๋จน๊ณ ์๋ชป ์ฐ๋ ๋ถ๋ถ๋ค์ ๊ณ ์ณค๋ค. ํด๋น ๋ถ๋ถ์ ๋ํ Log๋ ๋ค์ ๋จ๊ธฐ๋๋ก ํ๊ฒ ๋ค.
์ด๋ชจ์ง ๋ชจ์: ๐ค, โ โจ 0๏ธโฃ1๏ธโฃ2๏ธโฃ3๏ธโฃ4๏ธโฃ5๏ธโฃ6๏ธโฃ7๏ธโฃ8๏ธโฃ9๏ธโฃ๐