본문 바로가기

Algorithm

[프로그래머스 C++] Greedy 체육복

첫번째 풀이

3가지 규칙을 찾아서 간단하게 풀어봤습니다.

1. 도난당한 사람 양 옆에 여유분 있는 사람이 없다면 전체 n에서 -1

2. 여유분이 있는 사람보다 도난 당한 사람이 많다면 전체 n에서 (lost-reserve)값 만큼 빼줌

3. 위 두 규칙 모두 해당될 시 큰 수만 빼줌

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
#include <string>
#include <vector>
 
using namespace std;
 
int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = n;
    int rule1 = 0;
    int rule2 = 0;
    vector<int> student(n);
 
    int lostL = lost.size();
    int reserveL = reserve.size();
 
 
    for (int i = 0; i < lostL; i++) {
        student[lost[i] - 1-= 1;
    }//도난당한 사람 -1 해줌
 
    for (int i = 0; i < reserveL; i++) {
        student[reserve[i] - 1+= 1;
    }//여분있는 사람 +1 해줌
    
    //rule2 체크
    if (lostL > reserveL)
        rule2 += (lostL - reserveL);
    
    
    for (int i = 0; i < n; i++) {//rule1체크
        if (student[i] == -1) {
            if (i == 0 && student[i + 1!= 1)
                rule1++;
            else if (i == n - 1 && student[i - 1!= 1)
                rule1++;
            else
                if (i != 0 && i != n-1 && student[i - 1!= 1 && student[i + 1!= 1) {
                    rule1++;
                }
        }
    }
 
    if (rule1 > rule2)
        return answer - rule1;
    else
        return answer - rule2;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

규칙을 다 찾아서 적용했다고 생각했는데 예외가 있어 다시 수정했습니다.

위에는 다시 수정해볼게요. 아래 두번째 코드 참고하시면 됩니다.

두번째 풀이

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
#include <string>
#include <vector>
 
using namespace std;
 
int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    vector<int> student(n);
    
    for(int i = 0; i < lost.size(); i++){
        student[ lost[i]-1 ] -= 1;
    }//도난당한 사람 -1 해줌
    
    for(int i = 0; i < reserve.size(); i++){
        student[ reserve[i]-1 ] += 1;
    }//여분있는 사람 +1 해줌
    
    for(int i=0; i < n; i++){
        //여분이 있는 사람 양 옆에 체육복 없는지 확인
        
        if( student[i] == 1){
            if( i - 1 > -1){
                if( student[i-1== -1 ){
                    student[i-1+= 1;
                    student[i] -= 1;
                }
            }
        }
        
        if( student[i] == 1){
            if( i + 1 < student.size()){
                if( student[i+1== -1 ){
                    student[i+1+= 1;
                    student[i] -= 1;
                }
            }
        }
    }
    
    for(int i = 0; i< student.size(); i++){
        if( student[i] == 0 || student[i] == 1)
            ++answer;
    }
     
    
    return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
cs

위 코드는 한 명씩 체크해주면서 제거해서 반례도 없고 테스트 케이스를 100% 통과합니다.

 

 

두번째 풀이 참고한 링크

https://jjeongil.tistory.com/594

 

C++ : 프로그래머스 : 체육복: 풀이

풀이 #include #include using namespace std; int solution(int n, vector lost, vector reserve) { int answer = 0; vector student(n); for(int i = 0; i < lost.size(); i++..

jjeongil.tistory.com