티스토리 뷰

https://programmers.co.kr/learn/courses/30/lessons/42862?language=java

 

알고리즘 연습 - 체육복 | 프로그래머스

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다. 전체

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
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
 
 
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.assertThat;
 
public class SolutionTest {
 
    @Test
    public void 체육복문제_그리디알고리즘() {
 
        //given
        int n = 5;
        int[] lost = {2,4};
        int[] reserve = {3};
 
        //when
        int result = solution(n, lost, reserve);
 
        //then
        assertThat(result, is(4));
 
    }
 
    public int solution(int n, int[] lost, int[] reserve) {
        int unLuckyPeople = 0;
        Arrays.sort(lost);
        Arrays.sort(reserve);
 
        //여분 유니폼을 가져온 애꺼 훔쳐간 경우
        for(int i = 0; i < lost.length; i++) {
            for (int j = 0; j < reserve.length; j++) {
                if(lost[i] == reserve[j]) {
                    lost[i] = -1;
                    reserve[j] = -1;
                    break;
                }
            }
        }ㅋ
        
        for(int i = 0; i < lost.length; i++) {
            for(int j = 0; j < reserve.length; j++) {
                if(hasNotReserveUniform(lost[i],reserve[j])) {        //여분 유니폼 있는지 확인 안해도 되면 다음 번호로
                    continue;
                }
                if(hasReserveUniform(lost[i], reserve[j])) {        //여분 유니폼 빌렸을 경우
                    lost[i] = 0;
                    reserve[j] = 0;
                    break;
                }
            }
            if(lost[i] > 0) {
                unLuckyPeople++;
            }
        }
 
        return n - unLuckyPeople;
    }
 
    private boolean hasNotReserveUniform(int lost, int reserve) {
        if(lost-1 > reserve || lost+1 < reserve) {
            return true;
        }
        return false;
    }
 
    private boolean hasReserveUniform(int lost, int reserve) {
        if(lost-1 == reserve || lost+1 == reserve){
            return true;
        }
        return false;
    }
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

짧게! 짧게!!! 보다는 알아보기 쉽게! 가독성 최대로!

를 목표로 했는데... 둘다 실패했다.

잃어버린 학생 번호의 앞뒤만 확인하려고 과몰입하다보니 시야가 좁아진 것일까...

반복문 중첩은 O(N^2)이어서 최대한 이중 반복문은 피하려고도 했는데,

이것도 고민하다가 그냥 써버렸다.

좋아요를 많이 받은 코드는 훨씬 간단했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        answer = n;
 
        for(int i = 0; i < lost.length; i++) {
            boolean rent = false;
            int j = 0;
            while(!rent) {
                if(j == reserve.length)                   break;
                if(lost[i] == reserve[j])                {reserve[j] = -1; rent=true;}
                else if(lost[i] - reserve[j] == 1 )      {reserve[j] = -1; rent=true;}
                else if(lost[i] - reserve[j] == -1)      {reserve[j] = -1; rent=true;}
                else                                     {j++;                      }
            }
            if(!rent) answer--;
        }
        return answer;
    }
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

잃어버린 학생 - 여분 가져온 학생

해서 확인하면 되는 것을 미련했다.

댓글