본문으로 바로가기

문제

프로그래머스 > 2022 Dev-Matching: 게임 프로그래머 테스트

 

언어

JAVA

 

푼 문제

0 / 3

 

풀이시간 

2시간

 

후기

테스트에 사용된 문제를 남기는 것은 저작권에 위배된다고 하여 문제를 올리진 못합니다.

프로그래머스의 2022 Dev-Matching 게임 프로그래머 테스트에 대한 자료가 없어서 기록하려고 올립니다.

테스트 보셨던 분들 계시면 댓글 달아주세요~

 

2시간 풀었는데 결국 첫번째 문제도 다 못풀었습니다.

저는 첫번째 문제의 첫 케이스만 정답이었고 나머지는 오답이었습니다.

 

해당 문제는 코딩 복기하여 다시 풀었습니다.

 

구매 금액에 따른 고객 등급 유지 기간을 구하는 문제였습니다.

로직은 간단했지만 함정이 있어서 오래 걸렸던 것 같습니다.

 

표로 나타내면 아래와 같습니다.

등급에 맞는 기간을 합하여 등급순으로 return 하면 됩니다.

i beforeDate nowPrice sumPrice newDate differ 기간, 등급 금액
0 01.01 +5000 +5000 0 0  
1 01.20 +15000 +20000 01.20 19 19, 5000
2 01.31 -5000 +15000 01.31 11 11, 20000
3 02.09 +90000 +105000 02.09 9 9, 15000
4 02.19 -15000 +90000 02.19 10 10, 105000
5 03.11 -90000 0 03.11 20 20, 90000
6   0 0 12.31 296 296, 0

 

함정 1)

beforeDate 는 i == 0 째에만 넣어준다.

i == 1에서 differ = 19와 매칭되는 값은 i == 0 에서 +5000값이기 때문이다.

 

함정 2) 

마지막 12.31은 하드코딩해서 넣어야 하는 값이다.

처음엔 어떻게든 12.31을 리스트에 넣어서 해결하려고 했는데

굳이 그렇게 할 필요 없었다.

어차피 1년 365일이므로 differ 가 나올 때마다 365에서 뺀 다음

나머지 값은 어차피 제일 아래 등급이므로 거기에 + 해주면 되는 것이었다.

 

이 함정 2가지 늪에 빠져서 문제를 풀지 못했습니다.

문제를 복기하는 과정에서 코딩보다 손으로 디버깅하니까 더 빨리 풀립니다. 젠장..

실전에선 시간에 쫓기고 그러다보니 함정이 안 보였습니다.

 

그리고 솔직히 저에게만 함정이었지..

다른 분들은 그냥 쉽게 푸셨을 것 같습니다 ㅎㅎ..

 

이번에 코딩 테스트 보셨던 분들 댓글 좀 달아주세요~

소스 코드 공유해보아요 ㅎ.

 

 

소스코드

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package DevMachingGame20220305;
 
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
 
/**
 * 프로그래머스 > 2022 Dev-Matching: 게임 프로그래머 > 구매 등급별 유지 기간
 *
 * @author 
 * @since 2022.03.05 Sat 14:00:00
 */
 
public class PeriodByMemberClass {
    public static void main(String[] args) {
//        String[] purchase = {"2019/01/01 5000", "2019/01/20 15000", "2019/02/09 90000"}; 
        String[] purchase = {"2019/01/30 5000""2019/04/05 10000""2019/06/10 20000""2019/08/15 50000""2019/12/01 100000"}; 
        
        
        // key : 날짜, value : 가격 +-이벤트 
        Map<String, Integer> dayByClass = new HashMap<String, Integer>();
        
        for (int i = 0; i < purchase.length; i++) {
            
            String[] purchaseParse = purchase[i].split(" ");
            String date = purchaseParse[0];
            int price = Integer.parseInt(purchaseParse[1]);
            
            /*
             * 가격 이벤트 HashMap put
             */
            // 물건 구매한 날짜에는 + price
            dayByClass.put(date, +price);
            // 물건 구매후 30 + 1일 지난 날짜에는 - price
            int plusDay = 30;
            dayByClass.put(calDate(date, plusDay), -price);
            
        }
        
        // HashMap의 Key값을 자동으로 순서 배치
        TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>(dayByClass);
        
        String beforDate = "";
        int i = 0;
        int sumPrice = 0;
        int[] answer = new int[5];
        int sum1year = 365;
        
        for(Map.Entry<String,Integer> entry : treeMap.entrySet()) {
            int value = entry.getValue();
            if(i == 0) {
                beforDate = entry.getKey();
            } else {
                String newDate = entry.getKey();
                // 등급 별 유지 기간
                long differ = differDate(beforDate, newDate);
                
                // 365일에서 differ 나올 때 빼면 남은 값은 제일 아래 등급
                sum1year = sum1year - (int) differ;
                
                // 5개의 등급별 유지 기간 합산
                if(0 <= sumPrice && sumPrice < 10000) {
                    answer[0+= (int+differ;
                } else if(10000 <= sumPrice && sumPrice < 20000) {
                    answer[1+= (int+differ;
                } else if(20000 <= sumPrice && sumPrice < 50000) {
                    answer[2+= (int+differ;
                } else if(50000 <= sumPrice && sumPrice < 100000) {
                    answer[3+= (int+differ;
                } else if(100000 <= sumPrice) {
                    answer[4+= (int+differ;
                }
                beforDate = newDate;
            }
            
            sumPrice = sumPrice + value;
        
            i++;
            
        }
        
        // 남은 기간은 제일 아래 등급에 + 해준다.
        answer[0= answer[0+ sum1year;
        
    }
    
    // 날짜 차이 구하는 함수
    public static Long differDate(String beforDate, String newDate) {
        long diffDays = 0;
        try {
            Date format1 = new SimpleDateFormat("yyyy/MM/dd").parse(beforDate);
            Date format2 = new SimpleDateFormat("yyyy/MM/dd").parse(newDate);
            long diffSec = (format2.getTime() - format1.getTime()) / 1000;
            diffDays = diffSec / (24*60*60);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return diffDays;
    }
    
    // 날짜 더하는 함수
    public static String calDate(String dates, int plusDay) {
        // 2009.12.31 + 30일
 
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
        Date date = null;
        
        try {
    
          date = dateFormat.parse(dates);
        
        } catch (ParseException e) {
          e.printStackTrace();
        
        }
        
        Calendar cal = Calendar.getInstance();
        
        cal.setTime(date);
        
        cal.add(Calendar.DATE, plusDay);
        
        String strDate = dateFormat.format(cal.getTime());
 
        return strDate;
    }
}
 
cs

출처

프로그래머스 2022 Dev-Matching: 게임 프로그래머 테스트