https://school.programmers.co.kr/learn/courses/30/lessons/131127
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 확인
1. want + number = 10
2. discount에서 해당하는 구간의 값이 맞는 것을 찾아야 함
3. 순서는 상관 없음
4. 전부 다 일치하는 값만 카운트하여 반환
오답 정리
public String[] t10(String[] want, int[] number, String[] discount) {
int answer = 0;
String[] arr = new String[10];
int cnt = 0;
// 새로운 배열에 10개 담음
while(cnt < 10){
for(int i = 0; i < number.length; i++){
for(int j = 0; j < number[i] ; j ++){
arr[cnt] = want[i];
cnt++;
}
}
}
// discount 순회하면서 비교하기 -> 비교가 끝나면 계속해서 다음 날로 넘어감 ( +1 )
for(int i = 0; i < discount.length - 10; i++){
String[] dArr = new String[10];
int n = 0;
for(int j = i ; j < i + 10; j++){
dArr[n] = discount[j];
n++;
}
}
return arr;
}
- 우선 1차원적으로 접근하니 for문이 너무 많이 나왔다
- 이걸 어떡하냐 싶을 정도로 많아서 답이 없음 진짜로....
- 순회하면서 돌고 비교하는 것은 이해한 상태에서 어떻게 하면 이 상태를 정리하지 하고 고민하기 시작
- 원래는 큐나 덱을 사용해서 값을 빼내는 구조를 생각했는데 이대로 하면 저기에서 for문이 최소 한두개는 더 나와야 하는 문제가 생김... 저 이상 식을 늘리는 건 무리라고 판단
정답 풀이
1. key - value 형태로 값을 비교하기로 했음.
2. string을 기준으로 value값을 변경하고, value값은 증감이 가능하기 때문에(초기 맵에 삽입할 때) want, number 형태의 키 밸류를 정함
3. 우선 want의 길이를 돌면서 (want - number는 길이와 순서가 같다) 해당하는 값을 hashmap에 저장한다.,
4. 다음으로는 discount를 똑같이 10개 저장하는데, discount의 key를 저장하면서, 만약 원래 이 값이 존재한다면 이 값 + 1을 저장, 아니라면 0 + 1 ( = 1) 을 저장한다
5. 순회가 끝났다면 wnat로 만든 map을 기준으로 순회를 하고, 순회 중에 현재 매칭한 키의 밸류값보다 할인 품목의 값이 다르다면 false 반환 후 바로 다음으로 넘어감
6. true가 유지된다면 answer에 ++
public int t10(String[] want, int[] number, String[] discount) {
int answer = 0;
HashMap<String, Integer> hs = new HashMap<>();
// 키는 want, number는 val
// num은 변경될 예정
for(int i = 0; i < want.length; i++){
hs.put(want[i], number[i]);
}
// 이제 discount를 돌면서 값을 똑같이 hashmap에 넣기
// 계속해서 새로 체크할 것이기 때문에 내부에 hashmap 넣음
for(int i = 0; i <= discount.length - 10; i++){
HashMap<String, Integer> dis = new HashMap<>();
boolean isTrue = true;
for(int j = i ; j < i + 10; j++){
dis.put(discount[j], dis.getOrDefault(discount[j], 0) + 1);
}
// 이제 for을 돌면서 key로 매칭하여 같은 값이 존재하는지 보면 끝
for(String key : hs.keySet()){
// hs의 값이 더 크면 x
if(dis.getOrDefault(key, 0) < hs.get(key)){
isTrue = false;
break;
}
}
if(isTrue) answer++;
}
return answer;
}
+
깨달은 게 있다면 제일 간단하게 할 수 있는 방법을 생각해야 한다는 것...
제일 처음에 전부 일치하는 것 + 중복이 없는 것만 조금만 생각했어도 바로 hashMap을 생각할 수 있었을 건데 조금 둔했다 ( 순서가 필요 없다는 힌트까지 생각해놓고...ㅠ)
하나만 생각하지 말고 다양한 오브젝트를 활용하는 것을 고려하면서 풀어야겠다
'Algorithm' 카테고리의 다른 글
[020] H-Index (0) | 2024.02.27 |
---|---|
[019] n^2 배열 자르기 (1) | 2024.02.27 |
[017] 괄호 회전하기 (0) | 2024.02.26 |
[016] 연속 부분 수열 합의 개수 (1) | 2024.02.23 |
[015] 1918.후위 표기식 (0) | 2024.02.22 |