[우테코 3기] 6번 - Map, Set 로그 저장 문제

2020. 11. 9. 15:27알고리즘/코딩테스트

지난 토요일 우테코 코딩테스트를 봤습니다. 총 7문제 였고 4문제를 풀었는데 변별력은 나머지 3문제에 있다고 봅니다. 그래서 저는 떨어질 운명... 여튼 못푼 문제 중 그나마 나았던 6번 문제를 다시 구현해보았습니다. 우테코 기출문제는 공개하지 않는 것이 원칙이라하여 코드만 공유합니다.

다른 방법이 있을테지만 저는 Map과 Set 자료구조를 활용하여 무려 4차 반복문으로 풀었습니다. 로그값이 하나라도 다르면 탈출하기 때문에 이미 Set에 담은 answer 로그는 반복문을 돌지 않는다는 조건만 추가하면 시간초과는 나지않을 거라 생각됩니다.

Map 안에 value로 Map을 넣고, key값이 contains -> true면 조건문으로 쪼개서 value를 추가하는 부분과 중복없이 answer를 담기 위해 Set을 사용한 경험은 처음이었는데 잘 써보지 않은 자료구조를 배울 수 있어 좋았던 것 같습니다.

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
    public static void main(String[] args) {
        String[] log = {"1901 10 50""1909 10 50"};
        Iterator<String> iter = solution(log).iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }
    }
 
    public static TreeSet<String> solution(String[] logs) {
        int length = logs.length;
        String registNum = "";
        String testNum = "";
        String testScore = "";
        TreeSet<String> answer = new TreeSet<String>();
        Set<String> primaryKeys = new HashSet<>();
        //<수험번호, <문제번호, 점수>
        HashMap<String, HashMap<StringString>> logsMap = new HashMap<>();
        //모든 데이터 map에 저장(중복문제 점수업뎃 완료)
        for (int i = 0; i < length; i++) {
            registNum = logs[i].split(" ")[0];
            testNum = logs[i].split(" ")[1];
            testScore = logs[i].split(" ")[2];
 
            if (primaryKeys.contains(registNum)) {
                logsMap.get(registNum).put(testNum, testScore);
            } else {
                primaryKeys.add(registNum);
                HashMap<StringString> testMap = new HashMap<>();
                testMap.put(testNum, testScore);
                logsMap.put(registNum, testMap);
            }
        }
 
        String[] primaryKeysArr = primaryKeys.toArray(new String[primaryKeys.size()]);
        boolean overlapFlag = false;
 
        for (int i = 0; i < primaryKeysArr.length; i++) {
            String currentKey = primaryKeysArr[i];
            for (int j = 0; j < primaryKeysArr.length; j++) {
                String tempKey = primaryKeysArr[j];
                if (currentKey.equals(tempKey))
                    continue;
 
                Set<String> currentKeyTestKey = logsMap.get(currentKey).keySet();
                String[] currentKeyTestArr = currentKeyTestKey.toArray(new String[currentKeyTestKey.size()]);
                Set<String> tempKeyTestKey = logsMap.get(tempKey).keySet();
                String[] tempKeyTestArr = tempKeyTestKey.toArray(new String[tempKeyTestKey.size()]);
 
                int currentKeySize = currentKeyTestArr.length;
                int tempKeySize = tempKeyTestArr.length;
                int cnt = 0;
 
                testInspect:
                for (int k = 0; k < currentKeySize; k++) {
                    if (currentKeySize != tempKeySize) {
                        break;
                    } else {
                        //<문제번호, 점수> 같은지 비교검사
                        for (int l = 0; l < currentKeySize; l++) {
                            if (currentKeyTestArr[k].equals(tempKeyTestArr[l])) {
                                cnt++//일치하는 문제번호 수가 size와 같아야 함
                                if (logsMap.get(currentKey).get(currentKeyTestArr[k]).equals(
                                        logsMap.get(tempKey).get(tempKeyTestArr[l]))) {
                                    overlapFlag = true;
                                } else {
                                    overlapFlag = false;
                                    break testInspect;
                                }
                            }
                        }
                    }
                    if (overlapFlag && cnt == currentKeySize && cnt >= 5) {
                        answer.add(currentKey);
                        answer.add(tempKey);
                    }
                } //<문제번호, 점수> 비교검사
                overlapFlag = false;
            } //수험번호 비교검사
        } //for문 끝
 
        if (answer.isEmpty())
            answer.add("NONE");
 
        return answer;
    }
cs