첫번째 풀이
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
'Algorithm' 카테고리의 다른 글
[프로그래머스]Greedy 구명보트 (0) | 2020.03.25 |
---|---|
[프로그래머스 Java] 큰 수 만들기 알고리즘 (0) | 2020.03.23 |
[백준 알고리즘] 1874번 스택 수열 (0) | 2020.03.20 |
[백준 알고리즘]1003번 피보나치 함수(Runtime error 해결) (0) | 2020.03.05 |
[백준 알고리즘] 1929 소수구하기 C++ (시간초과 해결) (0) | 2020.03.01 |