https://school.programmers.co.kr/learn/courses/30/lessons/42862

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 풀이 (JAVA)

import java.util.*;
class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n; // 기본 값 = 모든 학생 수
        int [] a = new int[n+1]; // 잃어버린 학생 (동적 배열 선언)
        int [] b = new int[n+1]; // 여분가진 학생 (동적 배열 선언)
        for(int i=0; i<lost.length; i++){
            a[lost[i]] = 1; // 잃어버린 학생 배열 값 = 1
        }
        for(int i=0; i<reserve.length; i++){
            b[reserve[i]] = 1;  // 여분가진 학생 배열 값 = 1
        }
        for(int i=1; i<b.length; i++){
            if(b[i] == 1 && a[i] == 1){ // 여분을 가진 학생이 잃어버린 학생이라면 자기 것 제외
                b[i] = 0;  // 0으로 초기화
                a[i] = 0;
            }
            if(b[i] == 1){ // 여분을 가진 학생이 다른 학생에게 빌려줄수 있을시
                if(a[i-1] == 1){ // 앞번호 학생 탐색하여 1일시
                    a[i-1] = 0; 
                    b[i] = 0;
                }else if(i < b.length-2 && a[i+1] == 1){ // 뒷번호 학생 탐색, i의 인덱스초과방지
                    a[i+1] = 0;
                    b[i] = 0;
                }
            }
        }
        for(int i=0; i<a.length; i++){
            if(a[i] == 1){ // lost에 남아있는 1이 있다면 그 학생만큼 빼야함
                answer--;
            }
        }
        return answer;
    }
}

 

주요 핵심 포인트

1. 학생의 번호만큼 저장하기 위하여 동적 배열을 생성하였다.

2. 잃어버린 학생이나, 여분의 학생일시 1을 저장하였다. (기본 값 = 0)

3. 여분의 학생 인덱스가 잃어버린 학생의 인덱스 와 같은 경우, 본인의 것이므로 처리 후 0으로 변환한다.

4. 여분의 학생이 본인의 것이 아니라면, 앞번호 학생을 탐색하거나 뒷번호 학생을 탐색한다.

5. 뒷번호 학생 탐색시 인덱스 초과 오류를 방지하기 위하여 마지막 번호일시는 앞쪽만 탐색하도록 한다.

6. 기본 answer 값은 모든 학생의 수로 저장하였으며, 잃어버린 학생 수 만큼 빼준다면 남은 사람은 체육복이 있는 사람들이다.

개선해야할 사항

:처음에는 리스트로 풀고자 하였으나, 리스트로 푸는것보다 배열을 선언하여 각 학생의 정보를 1과 0으로 나누어 저장하여 비교하는것이 이 문제를 푸는것에 더 효율적이었다. 리스트로 풀었을경우, remove()시 인덱스가 변하기 때문에 처리하기가 까다롭다.

'프로그래머스(JAVA)' 카테고리의 다른 글

네트워크(인접리스트-DFS)  (0) 2023.04.23
성격 유형 검사하기  (0) 2023.01.15
K번째 수  (0) 2022.07.18
구명 보트  (0) 2022.07.16
주차 요금 계산  (0) 2022.07.16

+ Recent posts