programmers.co.kr/learn/courses/30/lessons/42578
코딩테스트 연습 - 위장
programmers.co.kr
내 두번째 level2 문제.
이번 문제는 Key, value 값에 대해 좀 더 깊게 고민해보았던 것 같다.
2차원 배열의 행이 {의상의 이름, 의상의 종류} 로 이루어져 있고,
서로 다른 옷의 조합의 수를 리턴해줘야 하기 때문에...후
일단 그리하여 내가 머리속으로 그린 순서는 이러했다.
1. 의상의 종류의 수가 몇개인지 구하자.
2. 그 의상의 종류의 수만큼 반복문을 사용하자.
3. 반복문을 사용하면서 해당 의상의 종류의 의상의 이름의 갯수가 몇개인지 구하자.
4. 해당 의상의 개수를 answer 값에 계속 곱하자.
생각보다 쉽게 느껴지는데??!!...는 무슨 여기서는 제한 사항이라는 트릭이 있다.
중요한 제한 사항으로는
최소 1개의 의상은 입는다는 것 무조건 각각 한 종류씩 입지는 않는 다는 것이다.
예를 들면
의상 종류 | 의상 이름1 | 의상 이름2 |
상의 | 반팔 | 셔츠 |
하의 | 반바지 | 면바지 |
신발 | 샌들 | 구두 |
하루는 반팔 하나만, 하루는 샌들이랑 반바지만 이런식으로 입을 수 있다는 얘기다.
그렇기 때문에 로직을 추가한다.
1. 각각의 종류를 선택하지 않을 경우의 수도 구해야하니 의상의 갯수 + 1을 answer 값에 계속 곱하자.
2. 그리고 위 처럼 곱하면 아무 것도 선택하지 않은 경우의 수도 포함이 되니 answer 값에 -1을 해주자.
그리고 리턴해주자.
코드는 이러하다.
public class SpyClothes {
public static void main(String[] args) {
String [][] clothes =
{
{"crowmask", "face"}
, {"bluesunglasses", "face"}
, {"smoky_makeup", "face"}
};
solution(clothes);
}
public static int solution(String[][] clothes) {
int answer = 0;
Stack<String> stack = new Stack<String>();
// 의상의 종류 구하기, 스택을 하나 선언하여 여기에 종류의 개수를 쌓아둔다.
for (int i = 0; i < clothes.length; i++) {
// 배열의 길이만큼 반복하여 스택에 없으면 push해서 쌓아둔다.
if (stack.contains(clothes[i][1])) {
continue;
} else {
stack.push(clothes[i][1]);
}
}
System.out.println(stack.size());
// 그럼 이게 의상 종류의 수가 된다.
while(!stack.isEmpty()) {
// 스택안이 비어있지 않을 때까지 반복
int temp = 0;
// 해당 종류의 개수가 몇개인지 담아줄 변수
String kind = stack.pop();
// 맨 마지막에 들어간 종류를 kind 변수에 초기화
for (int i = 0; i < clothes.length; i++) {
if (clothes[i][1].equals(kind)) {
temp++;
}
}
if (answer != 0) {
answer *= (temp + 1);
} else {
answer += (temp + 1);
}
System.out.println(kind + " : " + temp);
System.out.println("answer : " + answer);
}
return answer-1;
}
내가 스택을 사용하여 풀이를 한 이유
1. Collection들에 대해서 개념은 잡혔으나 아직 활용을 익숙하게 못하고 있는 상태
2. Stack을 한 번 써보고 싶었다. 크레인에서 충격을 1번 받았기 때문에
다만, 처리 속도는 20.00ms 평균인거 보니 그닥 좋은 코드는 아닌 듯 하다.
그래도 풀이를 했다는 것에 만족을 할 것이다! 추후에는 맵이나 리스트로도 풀이를 해봐야겠다!
[깃허브]
https://github.com/RUCKUSJERRY/practiceOfJava/blob/main/Prs_Pratice/src/com/level02/SpyClothes.java
RUCKUSJERRY/practiceOfJava
Contribute to RUCKUSJERRY/practiceOfJava development by creating an account on GitHub.
github.com
'문제풀이 > 프로그래머스' 카테고리의 다른 글
프린터 / level2 / 프로그래머스 연습문제 / programmers / 스택,큐 / java (0) | 2021.05.08 |
---|---|
기능개발 / 프로그래머스 연습문제 / programmers / level2 / java / 스택,큐 (0) | 2021.05.07 |
전화번호 목록 / 프로그래머스 연습문제 / programmers / level2 / java (0) | 2021.05.05 |
로또의 최고 순위와 최저 순위 / 프로그래머스 연습문제 / programmers / level1 / JavaScript (0) | 2021.05.04 |
소수 만들기 / 프로그래머스 연습문제 / programmers / level1 / java (0) | 2021.05.03 |