프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제풀이
1. 학생수 n 보다 2 큰 n+2 크기의 int[] arr을 생성 ( +2를 하는 이유는 코드를 줄이기 위함. 잃어버린 학생이 첫번째 학생일 때 좌우를 비교하는 경우 인덱스 [-1] 은 없는 인덱스 , 마찬가지로 맨 마지막 학생의 경우 그 다음 학생 arr[ n+1 ] 은 없는 인덱스 이므로 n+2 크기의 배열을 생성하여 맨 처음과 끝 인덱스를 추가 )
2. arr [ lost [ i ] ] 는 - - , arr [ reverse [ i ] ] 는 + + 로 잃어버린 학생 , 빌려줄 수 있는 학생 구분
3. arr [ 1 ] 부터 arr [ n ] 까지 순회하면서 arr [ i ] 가 -1 인 학생 좌우에 +1 인 학생이 있으면 0으로 바꿈 ( 이때 좌를 우선, 좌측 학생이 없는 경우 우측 학생 비교 )
4. answer는 초기값 answer = n 으로 잡고 , arr [ i ] = -1 의 좌우 학생에 +1 이 없으면 answer- - 카운팅
* 추가 팁 : 잃어버린 학생 ( arr[ i ] )의 좌우 학생 중 빌려줄 수 있는 학생을 찾을 때 , 좌측 학생이 빌려줄 수 있으면 arr [ i - 1 ] 은 굳이 0으로 바꿔주지 않아도 된다. 배열은 첫번째 학생부터 마지막 학생까지 순회하는데, 현재 잃어버린 학생 ( arr[ i ] ) 이후에 나타나는 잃어버린 학생 ( arr [ i + a ] )은 arr [ i - 1 ] 학생의 체육복을 빌릴 수 없기 때문. ( 문제 조건 , 코드를 줄이기 위함 )
나의풀이 ( 코드 )
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = n;
int[] arr = new int[n + 2];
for (int i = 0; i < lost.length; i++) {
arr[lost[i]]--;
}
for (int i = 0; i < reserve.length; i++) {
arr[reserve[i]]++;
}
for (int i = 1; i <= n; i++) {
if (arr[i] == -1) {
if (arr[i - 1] == 1) { // 좌측 학생 먼저 비교
// arr [ i - 1 ] 을 0으로 바꾸지 않음
} else if (arr[i + 1] == 1) {
arr[i + 1] = 0;
} else {
answer--;
}
}
}
return answer;
}
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스/JAVA 자바] 성격 유형 검사하기 (2) | 2024.04.19 |
|---|---|
| [프로그래머스/JAVA 자바] 크레인 인형뽑기 게임 (0) | 2024.04.18 |
| [프로그래머스/JAVA 자바] 완주하지 못한 선수 (0) | 2024.04.17 |
| [프로그래머스/JAVA 자바] 로또의 최고 순위와 최저 순위 (0) | 2024.04.17 |
| [프로그래머스/JAVA 자바] [1차] 다트 게임 (0) | 2024.04.16 |