프로그래머스 알고리즘 (java)
위장
내가 작성한 코드
set
으로 카탈로그를 뽑아내고 카탈로그별 숫자를 구해 각각 곱해줘 경우의 수를 구했다.
- set을 안쓰고 리스트를 써도 될 것 같다.
public class Camouflage {
public int solution(String[][] clothes) {
int answer = 1;
Set<Category> category = new HashSet<>();
for (String[] clothe : clothes) {
//카태고리가 없으면 카태고리 생성
if (!category.contains(new Category(clothe[1]))) {
category.add(new Category(clothe[1]));
} else {
// 있으면 그 카태고리를 찾아 값 증가
for (Category category1 : category) {
category1.add(clothe[1]);
}
}
}
// 안뽑는 경우의 수를 생각해 +1
for (Category category1 : category) {
answer *= (category1.getSize() + 1);
}
// 아무것도 안뽑은 경우가 포함된 것 이므로 -1;
return answer - 1;
}
// 객체로 뽑아냄 굳이 안써도 될듯
public class Category {
private String caegory;
private int size = 1;
public Category(String caegory) {
this.caegory = caegory;
}
public void add(String caegory) {
if (this.caegory.equals(caegory)) {
size++;
}
}
public int getSize() {
return size;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Category category = (Category) o;
return Objects.equals(caegory, category.caegory);
}
@Override
public int hashCode() {
return Objects.hash(caegory);
}
}
}
다른 사람들의 풀이 중 참고할 점
내가 생각한대로 set을 안써도 됬다.
해쉬인데 왜 set을 쓰려했을까...
그냥 맵을 사용하고 맵의 value 값을 증가시켜주면 됬는데...
바보같이 푼거 같다.
참고한 후 다시 푼 코드
public int solution2(String[][] clothes) {
int answer = 1;
Map<String, Integer> list = new HashMap<>();
for (String[] clothe : clothes) {
if (!list.containsKey(clothe[1])) {
list.put(clothe[1],1);
} else {
list.put(clothe[1],list.get(clothe[1])+1);
}
}
for (Integer value : list.values()) {
answer *= (value + 1);
}
return answer - 1;
}