티스토리 뷰
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 org.junit.Test;
import java.util.Arrays;
import java.util.Optional;
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;
//여분 유니폼을 가져온 애꺼 훔쳐간 경우
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
|
잃어버린 학생 - 여분 가져온 학생
해서 확인하면 되는 것을 미련했다.
'기초CS > 알고리즘' 카테고리의 다른 글
[프로그래머스] 알고리즘 연습 문제 : 스킬트리 (자바/JAVA) (0) | 2019.06.21 |
---|---|
[프로그래머스] 알고리즘 연습 문제 : 최솟값 만들기 (자바/JAVA) (0) | 2019.05.30 |
[프로그래머스] 알고리즘 연습 문제 : 나누어 떨어지는 숫자 배열 (자바/JAVA) (0) | 2019.05.28 |
[프로그래머스] 알고리즘 연습 문제 : 문자열 내 마음대로 정렬하기(자바/JAVA) (0) | 2019.05.27 |
[프로그래머스] 알고리즘 연습 문제 : 같은 숫자는 싫어(자바/JAVA) (0) | 2019.04.29 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- codility
- 맵 api
- K번째수
- json
- java
- Spring
- 자바
- 문자열 내 마음대로 정렬하기
- 124 나라의 숫자
- 스프링 부트
- 더 나은 내일
- cgv
- 파이팅코리아
- 예매 알림
- API
- 프로그래머스
- 텔레그램
- 다음 맵 api
- AWS
- 기능개발
- 노션트렐로광고X
- 알고리즘
- 타겟 넘버
- 최솟값
- 쇠막대기
- 완주하지 못한 선수
- 카카오인턴
- 안드로이드 스튜디오
- FrogJmp
- 객체지향과 디자인패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함