코테/프로그래머스

[프로그래머스/Lv.2] 할인 행사 (JAVA)

imname1am 2023. 9. 22. 23:57
반응형

🔺 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.*;
 
class Solution {    
    public int solution(String[] want, int[] number, String[] discount) {
        int answer = 0;
        
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < want.length; i++) {
            map.put(want[i], number[i]);
        }
        
        for (int i = 0 ; i <= discount.length - 10; i++) {    // 범위 안 벗어나게 (discount 길이 - 10)까지만 설정
            boolean isSame = true;
            
            Map<String, Integer> tmpMap = new HashMap<>();
            for (int j = i; j < i + 10; j++) {  // i ~ (i + 10)번째 원소까지 10개
                tmpMap.put(discount[j], tmpMap.getOrDefault(discount[j], 0+ 1);
            }
            
            // 기준이 되는 map과 현재 생성한 tmpMap의 원소 갯수가 같은지 선형 탐색
            for (int k = 0; k < want.length; k++) {
                if (tmpMap.get(want[k]) != map.get(want[k])) {    // 갯수가 다르면 바로 탈출
                    isSame = false;
                    break;
                }
            }
            
            // 같은 Key 값에 대한 Value 값이 두 Map에서 모두 동일한 경우, 정답 갯수 +1 
            if(isSame) answer++;
        }
 
        return answer;
    }
}
 
cs

 

🧩 해결 아이디어

• Map 사용

- Map<want 배열의 항목, number 배열에서 해당 항목 갯수>로 받게끔 Map<String, Integer>로 설정한다.

- discount 배열에서 10개의 항목을 연달아 받을 시작 인덱스를 설정한다. (0 ~ discount 배열의 길이 - 10 + 1번째 원소까지)

   ㄴ시작 ~ 시작 인덱스 + 10번째까지 10일 간 항목을 보며, tmpMap<항목명, 살 수 있는 갯수>을 채운다

   ㄴ 만약 현재 tmpMap에서 해당 항목의 갯수가 map에서의 항목 갯수와 다르다면 바로 반복문 탈출 (같은 상태로 쭉 진행되면 정답 + 1)

 

 


🔺 다른 풀이들

- 두 Map 간 Key에 따른 Value 값 비교할 때 향상형 for문 사용하셨다.

for(String key : map.keySet() {}
 

[프로그래머스] 할인 행사 (Java)

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 접근 방

maicoding.tistory.com

 

- List를 활용하셨다.

 

[Java/자바] 프로그래머스 Lv2 - 할인 행사

문제 설명 XYZ 마트는 일정한 금액을 지불하면 10일 동안 회원 자격을 부여합니다. XYZ 마트에서는 회원을 대상으로 매일 한 가지 제품을 할인하는 행사를 합니다. 할인하는 제품은 하루에 하나씩

hstory0208.tistory.com


💬 느낀 점

이것이 레벨 2...?

나 맵 문제 좋아하는데 어렵다기보다는 간만에 힐링됐다(?)

 

 

1회독 2회독 3회독 4회독 5회독
V 240213      

 

 

(+ 240213 2회독)

23분 소요...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.*;
 
class Solution {
    public int solution(String[] want, int[] number, String[] discount) {
        
        Map<String, Integer> map = new HashMap<>();
        for(int i = 0 ; i < want.length ; i++) {
            map.put(want[i], number[i]);
        }        
        
        int answer = 0;
        
        for(int i = 0 ; i <= discount.length - 10 ; i++) {  // 🔔 범위 등호 조심!!
            Map<String, Integer> tmpMap = new HashMap<>();
            
            for(int j = i ; j < i + 10 && j < discount.length ; j++) {  // 제품 10개 확인
                tmpMap.put(discount[j], tmpMap.getOrDefault(discount[j], 0+ 1);
            }
            
            boolean isSame = true;
            for(String w : want) {
                if(map.get(w) > tmpMap.getOrDefault(w, 0)) {    // 두 Map에서 제품의 갯수가 다르다면 탈출
                    isSame = false;
                    break;
                }
            }
            
            if(isSame)   answer++;
        }      
        
        return answer;
    }
}
cs

반응형