프로그래밍/Algorithm

[프로그래머스] 모의고사

Jay Tech 2018. 10. 21. 22:07
반응형
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
public class SampleTest {
    public static void main(String[] args) {
        int[] answer = {};
        int[] answers = {1,2,3,4,5};
        
        int[] a = {1,2,3,4,5};
        int[] b = {2,1,2,3,2,4,2,5};
        int[] c = {3,3,1,1,2,2,4,4,5,5};
 
        int[] count = {0,0,0};
        int j = 0;
        int loopA = a.length;
        int loopB = b.length;
        int loopC = c.length;
        int aIdx, bIdx, cIdx;
 
        answer = new int[3];
        
        for(int i = 0; i < answers.length; i++) {
            
            if(i > a.length) {
                aIdx = i % loopA;
                if(a[aIdx] == answers[i]) {
                    count[0]++;
                }
            } else {
                if(a[i] == answers[i]) {
                    count[0]++;
                }
            }
            
            if(i > b.length) {
                bIdx = i % loopB;
                if(b[bIdx] == answers[i]) {
                    count[1]++;
                }
            } else {
                if(b[i] == answers[i]) {
                    count[1]++;
                }
            }
            
            if(i > c.length) {
                cIdx = i % loopC;
                if(c[cIdx] == answers[i]) {
                    count[2]++;
                }
            } else {
                if(c[i] == answers[i]) {
                    count[2]++;
                }
            }
        }
        
        int max = 0;
        
        for(int i = 0 ; i <count.length; i++) {
            if(max < count[i]) {
                max = count[i];
            }
        }
        
        int arrCnt = -1;
        for(int i = 0 ; i < count.length; i++) {
            if(max == count[i]) {
                answer[i] = i+1;
                arrCnt++;
            }
        }
        
        System.out.println("al : " + arrCnt);
        int[] tmp = new int[arrCnt+1];
 
        for(int i = 0 ; i < arrCnt+1; i++) {
            tmp[i] = answer[i];
        }
        //System.out.println();
        answer = tmp;
        for(int i = 0 ; i < answer.length; i++) {
            System.out.println(answer[i]);
        }
       
    }
}
cs




문제를 풀 때 그냥 문제가 원하는 대로 해야한다. 수포자 3명의 규칙에 대한 값을 그냥 상수로 넣어도 되는데 범용적인 경우를 생각하려다보니까 각 길이마다 변수를 주고 이용하려고 하였다. 채점 도중 시간만 오버되는 문제가 발생한다. 

이런 문제들은 답이 빨리 나와야 하기 때문에 복잡하게 할 필요가 없었다.


문제점 : 배열을 처음에 초기화하고 나중에 길이를 줄이려고 임시 배열을 만들고 복사하는 형태로 옮겼다. 하지만 이럴 필요없이 ArrayList에 답을 담은 후 나중에 답을 넣을 배열의 길이를 ArrayList의 길이 만큼 잡아 주면 되는 것이다.




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
import java.util.*;
 
class Solution {
    public int[] solution(int[] answers) {
         int[] answer = {};
 
        ArrayList<Integer> temp = new ArrayList<>();
 
        int[] a = {1,2,3,4,5};
        int[] b = {2,1,2,3,2,4,2,5};
        int[] c = {3,3,1,1,2,2,4,4,5,5};
 
        int[] count = {0,0,0};
 
        for(int i = 0 ; i < answers.length; i++) {
            if(answers[i] == a[i % 5]) {
                count[0+= 1;
            }
 
            if(answers[i] == b[i % 8]) {
                count[1+= 1;
            }
 
            if(answers[i] == c[i % 10]) {
                count[2+= 1;
            }
        }
 
        int max = count[0];
        for(int i = 0; i < count.length; i++) {
            if(max < count[i]) {
                max = count[i];
            }
        }
 
        for(int i = 0; i < count.length; i++) {
            if(count[i] == max) {
                temp.add(i+1);
            }
        }
 
        answer = new int[temp.size()];
 
        for(int i = 0; i < temp.size(); i++) {
            answer[i] = temp.get(i);
        }
 
        Arrays.sort(answer);
 
        return answer;
    }
}
 
cs








반응형