programmers 모의고사
문제 자체는 크게 어렵지 않아 어떻게 좀 더 효율적으로 풀 수 있을지에 초점을 맞춰 설명해보겠습니다. 전 좀 길게 그리고 비효율적으로 푼 것 같아 아쉬운데요. 역시나 다른 사람들은 짧고 효율적으로 풀었더라구요. 비교해봅시다.
각 학생들의 성적을 매기는 과정
저의 코드는 다음과 같습니다.
for (int j = 0; j < student.size(); j++) {
for (int i = 0; i < answers.length; i++) {
if (answers[i] == student.get(j)[index[j]]) {
score[j]++;
}
index[j]++;
if (index[j] == student.get(j).length) {
index[j] = 0; // 인덱스 초기화
}
}
}
전 배열에서 값을 가져올 인덱스를 다시 초기화할 때 길이를 비교하는 if
문을 사용했는데요. 사실 %
을 이용하면 인덱스를 그 자리에서 바로 갱신하도록 할 수 있더라구요. 다른 사람의 풀이는 다음과 같습니다.
for(int i=0; i<answer.length; i++) {
if(answer[i] == a[i%a.length]) {score[0]++;}
if(answer[i] == b[i%b.length]) {score[1]++;}
if(answer[i] == c[i%c.length]) {score[2]++;}
}
%
을 활용하면 만약 길이가 5인 배열이 있다면 5가 되는 순간 0이 되기 때문에 인덱스가 다시 처음으로 돌아가는 것입니다.
각 스코어가 담긴 배열에서 가장 높은 성적 학생의 인덱스 출력(같으면 오름차순으로 모두 출력)
이 부분이 '좀 더 나은 방법이 없을까' 고민했던 부분입니다. 전 리스트와 가장 높은 점수 변수를 만들어서 가장 높은 점수와 같으면 리스트에 넣고 더 높으면 리스트 비우고 더 큰 수 집어넣도록 하고 마지막에 sort
해줬습니다.
public int[] printHighestIndex(int[] score) {
int high = 0;
List<Integer> highestIndex = new ArrayList<>();
for (int i = 0; i < score.length; i++) {
if (score[i] > high) {
high = score[i];
highestIndex.clear();
highestIndex.add(i + 1);
} else if (score[i] == high) {
highestIndex.add(i + 1);
}
}
int[] answer = highestIndex.stream().mapToInt(i->i).toArray();
Arrays.sort(answer);
return answer;
}
하지만 이렇게 말고 가장 큰 수를 먼저 구한다음 제일 처음부터 가장 큰 수와 같은 수의 인덱스를 리스트에 집어넣으면 위에 제가 했던 과정을 한 번에 처리할 수 있습니다. 다른 사람의 풀이는 다음과 같습니다.
int maxScore = Math.max(score[0], Math.max(score[1], score[2]));
ArrayList<Integer> list = new ArrayList<>();
if(maxScore == score[0]) {list.add(1);}
if(maxScore == score[1]) {list.add(2);}
if(maxScore == score[2]) {list.add(3);}
return list.stream().mapToInt(i->i.intValue()).toArray();
몇 개 없는 수 중 가장 큰 수를 구할 때 Math.max
를 이렇게 겹쳐서 쓸 수도 있네요. 여기에 좀 더 살펴볼 부분이 있는데요. List<Integer>
를 int[]
로 바꾸는 과정입니다. 전 toArray()
를 사용할 수 있을 줄 알았는데 안되더라구요. 이 경우 stream을 써서 list.stream().mapToInt(i -> i.intValue()).toArray()
로 사용할 수 있습니다. 알고리즘 풀 때 유용하게 사용할 수 있을 것 같아요!
'Algorithm > problem solving' 카테고리의 다른 글
Today's Algorithm(2018-11-04) (0) | 2018.11.04 |
---|---|
Today's Algorithm(2018-11-01) (0) | 2018.11.01 |
Today's Algorithm(2018-10-30) (0) | 2018.10.30 |
Today's Algorithm(2018-10-29) (0) | 2018.10.29 |
Today's Algorithm(2018-10-26) (0) | 2018.10.26 |