๐๋ฌธ์ ์ค๋ช
๐ต๐ฟ์คํ์ด๋ค์ ๋งค์ผ ๋ค๋ฅธ ์ท์ ์กฐํฉํ์ฌ ์ ์ด ์์ ์ ์์ฅํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์คํ์ด๊ฐ ๊ฐ์ง ์ท์ด ์๋์ ๊ฐ๊ณ ์ค๋ ์คํ์ด๊ฐ ๋๊ทธ๋ ์๊ฒฝ, ๊ธด ์ฝํธ, ํ๋์ ํฐ์ ์ธ ๋ฅผ ์ ์๋ค๋ฉด ๋ค์๋ ์ ์ฒญ๋ฐ์ง๋ฅผ ์ถ๊ฐ๋ก ์ ๊ฑฐ๋ ๋๊ทธ๋ ์๊ฒฝ ๋์ ๊ฒ์ ์ ๊ธ๋ผ์ค๋ฅผ ์ฐฉ์ฉํ๊ฑฐ๋ ํด์ผ ํฉ๋๋ค.
์ข ๋ฅ | ์ด๋ฆ |
---|---|
์ผ๊ตด | ๋๊ทธ๋ ์๊ฒฝ, ๊ฒ์ ์ ๊ธ๋ผ์ค |
์์ | ํ๋์ ํฐ์ ์ธ |
ํ์ | ์ฒญ๋ฐ์ง |
๊ฒ์ท | ๊ธด ์ฝํธ |
์คํ์ด๊ฐ ๊ฐ์ง ์์๋ค์ด ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด clothes๊ฐ ์ฃผ์ด์ง ๋ ์๋ก ๋ค๋ฅธ ์ท์ ์กฐํฉ์ ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
๐์ ํ์ฌํญ
๐พ์ ์ถ๋ ฅ ์
clothes | return |
---|---|
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]] | 5 |
[["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]] | 3 |
์์ #1
headgear์ ํด๋นํ๋ ์์์ด yellow_hat, green_turban์ด๊ณ eyewear์ ํด๋นํ๋ ์์์ด blue_sunglasses์ด๋ฏ๋ก ์๋์ ๊ฐ์ด 5๊ฐ์ ์กฐํฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
1. yellow_hat
2. blue_sunglasses
3. green_turban
4. yellow_hat + blue_sunglasses
5. green_turban + blue_sunglasses
์์ #2
face์ ํด๋นํ๋ ์์์ด crow_mask, blue_sunglasses, smoky_makeup์ด๋ฏ๋ก ์๋์ ๊ฐ์ด 3๊ฐ์ ์กฐํฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
1. crow_mask
2. blue_sunglasses
3. smoky_makeup
๐๋ฌธ์ ์ดํด ๋ฐ ํ์ด๊ณํ
โ๏ธ์ปค๋ฎค๋ฌ๋ ์ด์ ์ ํ๋ฒ ํ์ด๋ณธ ๊ธฐ์ต์ด ์๋ค. ๊ทธ ๋๋ ์๊ฐ์์ด ๊ฐ ์ข
๋ฅ์ ๋ชจ๋ ์์์ String ๋ฐฐ์ด๋ก ์ ์ฅํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๊ณ , ์ด์ค ํด์ฌ๋งต์ ์ฌ์ฉํ์ฌ HashMap<String, ArrayList<String>>
ํด์ฌ๋งต ์์ ArrayList๋ก ๋ชจ๋ ์์์ ์ ์ฅํ์ฌ ํ์๋ค.
โ๏ธํ์ง๋ง, ์ด๋ฒ์ ๋ฌธ์ ๋ฅผ ๋ค์ ํ๋ฉด์ ๊ตณ์ด String๋ฐฐ์ด๋ก ๋ชจ๋ ์์์ ๊ตฌ๋ถํ์ฌ ์ ์ฅํ ํ์๊ฐ ์๊ณ HashMap<String, Integer>
๋ก ๊ฐ ์ข
๋ฅ๋ณ ์์ ๊ฐ์๋ง ์๋ฉด ๋๋ค๋ ์ฌ์ค์ ๊นจ๋ฌ์๋ค.
โ๏ธ์ด ์์์ ์กฐํฉ์ *= (์ข
๋ฅ๋ณ ์์ ๊ฐ์ + 1(์
์ง ์๋ ๊ฒฝ์ฐ)) ๋ก ์ด ๊ฐ์๋ฅผ ๊ตฌํ ๋ค, - 1(์๋ชธ์ธ ๊ฒฝ์ฐ)๋ฅผ ๋นผ์ค๋ค.
โ๋ด ์ฝ๋1 - HashMap<String, ArrayList<String>>
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public static int solution(String[][] clothes) {
Map<String, ArrayList<String>> clothing = new HashMap<String, ArrayList<String>>();
ArrayList<String> details;
for(int i=0; i<clothes.length; i++) {
if(clothing.containsKey(clothes[i][1])) { // ๋งต์ ์กด์ฌํ๋ ํค๋ผ๋ฉด
clothing.get(clothes[i][1]).add(clothes[i][0]);
}
else {
details = new ArrayList<String>(); // ์๋ก์ด List ์์ฑ
details.add(clothes[i][0]);
clothing.put(clothes[i][1], details);
}
}
// Set<String> keys = clothing.keySet(); // ๋งต์ ํค ์งํฉ
Collection<ArrayList<String>> values = clothing.values(); // ๋งต์ value์งํฉ
Iterator<ArrayList<String>> iter = values.iterator();
int answer = 1;
while(iter.hasNext()) {
int value = iter.next().size();
answer *= value+1;
}
return answer-1;
}
}
โ๋ด ์ฝ๋2 - HashMap<String, Integer>
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
HashMap<String, Integer> map = new HashMap<String, Integer>();
// map.put(clothes[0][1], 1);
for(int i=0; i<clothes.length; i++){
String type = clothes[i][1];
if(map.get(type) == null) { // ํด๋น ์ท์ ์ข
๋ฅ๊ฐ ์์ ๋
map.put(type, 1);
}
else {
int num = map.get(type);
map.put(type, num+1); // ๊ฐ์ ์ถ๊ฐ
}
}
// ์ด ์ท์ ์กฐํฉ : ์ท์ ๊ฐ์ + ์์
๋ ๊ฒฝ์ฐ(1)
for(int value : map.values()) {
answer *= (value+1);
}
// ๋งจ๋ชธ์ธ ๊ฒฝ์ฐ(1)๋ฅผ ๋นผ์ค๋ค.
return answer - 1;
}
}
๐1์ ํ์ด๋ณด๋ค ๋ณต์กํ์ง ์๊ณ ๊ฐ์๋ง ํ์
ํ์ฌ ๊ฐ๋จํ ๊ตฌํ ์ ์๋ค!
๐map์ 0๋ฒ์งธ๋ฅผ ๋จผ์ ๋ฃ์ด์ค ์ด์ ๋ 1์ ํ์ด๋ฅผ ํ ๋ ArrayList๊ฐ ๋น์ด์์ด์ ์ค๋ฅ๊ฐ ๋ฌ๋(?) ๊ธฐ์ต์ด ์๋๋ฐ ๊ตณ์ด ๊ทธ๋ด ํ์๊ฐ ์๋ ๋ถํ์ํ ์ฝ๋์์ ๊ฐ์ด ์๊ฐํ๋ ์ปค๋ฎค๋ฌ๋๋ถ๋ค์ ๋ฆฌ๋ทฐ๋ฅผ ํตํด ์๊ฒ๋์๋ค!๐ฃ (๊ฐ์ฌํฉ๋๋ค ์ฌ๋ํด์)
๐ญ๊ฐ์๋ด์ฉ
โ๏ธ์์ฅ ์์ดํ
์ ์ข
๋ฅ๋ณ๋ก ๊ฐ์๋ฅผ ์ธ๋๊ฒ ํต์ฌ์ด๋ค. => ํด์ฌ ์ฌ์ฉ(๋งต)
โ๏ธMap<String, Integer>
๋งต์ ์ธํฐํ์ด์ค์ด๋ฏ๋ก new๋ก ์์ฑ์ ์๋๊ณ ๋งต ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค.(ํด์ฌ๋งต์ ๊ทธ ์ค์ ํ๋)
โ๐ป๊ฐ์ ์ฝ๋
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
Map<String, Integer> counts = new HashMap<String, Integer>();
for(String[] c : clothes) {
// c[0] ์์ ์ด๋ฆ
// c[1] ์์ ์ข
๋ฅ
// ์ด๋ฆ์ ์ ๊ฒฝ์ฐ์ง ์๊ณ ์ข
๋ฅ๋ง ๊ฐ์ ธ์ค๋๋ก ํ๋ค.
String type = c[1];
// counts.put(type, counts.get(type) == null ? 0 : counts.get(type) + 1);
// ์ผํญ์ฐ์ฐ์๋ก ํ์ด๋ ๋์ง๋ง, map์ getOrDefaultํจ์๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ์์ฑํด์ค๋ค.
counts.put(type, counts.getOrDefault(type, 0) + 1);
}
int answer = 1;
for(Integer c : counts.values()) {
answer *= c + 1;
}
// ๋งจ๋ชธ์ธ ๊ฒฝ์ฐ(1)๋ฅผ ๋นผ์ค๋ค.
return answer - 1;
}
}
โ๏ธfor(String[] c : clothes)
์ด๋ฐ์์ผ๋ก์ for๋ฌธ ํ์ฉ๋ฒ์ ์ตํ๋๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
โ๐ป๊ฐ์ ์ฝ๋ - ์ฝ๋ ๋ฆฌํํ ๋ง
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
return Arrays.stream(clothes)
.map(c -> c[1]) // ์ท์ ์ข
๋ฅ๋ค์
.distict // ์ค๋ณต์์ด type์ผ๋ก
.map(type -> Arrays.stream(clothes).filter(c -> c[1].equals(type)).count())
.map(c -> c + 1)
.reduce(1, (c, n) -> (c * n) - 1;
}
}
๐ก๋ฌด์กฐ๊ฑด ์ฝ๋๋ฅผ ์งง๊ฒ ์ค์ธ๋ค๊ณ ์ข์ ๊ฒ์ ์๋์ง๋ง ์ต๋ํ ๋ถํ์ํ ์ฝ๋๋ฅผ ์ค์ฌ ๊ฐ๋
์ฑ์ ๋์ด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
๐กStream์ ์ฝ๋๋ฌธ์ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋์ ์๋๊ฐ ๋๋ฆฌ๋ค๋ ๋จ์ ์ด ์๋ค! (ํ์ง๋ง ๋์ฉ๋ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋๊ฒ ์๋๋ผ๋ฉด, ์๊ณ ๋ฆฌ์ฆ ํธ๋ ๋ฐ ์์ด์๋ ์๊ด์์ ๋ฏ ํ๋ค. ๐)