문제를 읽어보면 0번 인덱스
에는 아이템이름을 1번 인덱스
에는 아이템 종류를 넣어 입력한다. 따라서 이 문제를 읽고 '아 1번 인덱스
를 키로 가지고 0번 인덱스
를 값으로 가지는 list 로 만들자' 라고 생각했다. 즉 입력받은 파라미터로 키가 이미 존재하면 value
를 꺼내서 0번 인덱스
를 추가하고 존재하지 않으면 map()
자체를 새로 만들면 되겠다고 생각했다. 그리고 랜덤의 key에서 하나씩 value를 뽑는데 이때 key의 개수만큼을 최대로 뽑을 수 있겠구나 라고 생각해서 for문
을 구현했다.
for(String key: map.keySet()){
int size = map.get(key).size();
answer *= (size+1);
}
코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다.
예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다.
package 프로그래머스;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;
public class 의상 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[][] clothes = new String[3][2]; //0번인덱스: 상품명 1번인덱스: 종류
StringTokenizer str;
for(int i=0; i<3; i++){
String lines = br.readLine();
for(int j=0; j<2; j++){
str = new StringTokenizer(lines);
clothes[i][j] = str.nextToken();
}
}
}
public static int solution(String[][] clothes){
int answer = 1;
HashMap<String, List<String>> map = new HashMap<>();
for(int i=0; i<clothes.length; i++){
String key = clothes[i][1];
String value = clothes[i][0];
if(!map.containsKey(clothes[i][1])){
map.put(key, new ArrayList<>(List.of(value)));
}else{
List<String> values = map.get(key);
values.add(value);
map.replace(key, values);
}
}
for(String key: map.keySet()){
int size = map.get(key).size();
answer *= (size+1);
}
answer -= 1;
return answer;
}
}
import java.util.*;
import static java.util.stream.Collectors.*;
class Solution {
public int solution(String[][] clothes) {
return Arrays.stream(clothes)
.collect(groupingBy(p -> p[1], mapping(p -> p[0], counting())))
.values()
.stream()
.collect(reducing(1L, (x, y) -> x * (y + 1))).intValue() - 1;
}
}
다른 사람의 풀이를 보니 이런식으로 return 값에서 모두 해결해버리는 극한의 효율,,, 이 존재할 수 있구나 생각이 든다.
import java.util.HashMap;
import java.util.Iterator;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
HashMap<String, Integer> map = new HashMap<>();
for(int i=0; i<clothes.length; i++){
String key = clothes[i][1];
if(!map.containsKey(key)) {
map.put(key, 1);
} else {
map.put(key, map.get(key) + 1);
}
}
Iterator<Integer> it = map.values().iterator();
while(it.hasNext()) {
answer *= it.next().intValue()+1;
}
return answer-1;
}
}
위 풀이는 그나마 내가 구현한 풀이랑 비슷해보인다. 다만 Iterator()
를 사용하는 법도 익혀놔야겠다.