티스토리 뷰

프로그래머스 1단계 체육복 문제

 url: https://programmers.co.kr/learn/courses/30/lessons/42862?language=java


문제 설명

오늘은 체육수업이 있는 날입니다. 그런데 점심시간에 도둑이 들어 몇몇 학생의 체육복이 도난을 당했습니다. 다행히 일부 학생들이 여벌의 체육복을 가져왔습니다. 학생들의 번호는 체격 순으로 매겨져 있기 때문에 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려주려고 합니다.

예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 당연히 체육복을 2벌 가져온 학생의 체육복이 도난을 당했다면, 여벌의 체육복을 빌려줄 수 없습니다. 체육복이 없으면 체육수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 듣고 싶습니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.


제한사항

전체 학생의 수는 2명 이상 30명 이하입니다. 체육복을 도난당한 학생의 수는 2명 이상 n명 이하이고 중복되는 번호는 없습니다.

여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.


입출력 예

 n

lost 

reserve 

return 

 5 

 [2, 4] 

 [1, 3, 5] 

 5 

 5

 [2, 4] 

 [3] 

 4 


입출력 예 설명

예제 #1

1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.


예제 #2

3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.


자바 코드

import java.util.*;
class Solution {
    public static int solution(int n, int[] lost, int[] reserve) {
        List lostList = new ArrayList<>();
        for(int num : lost)
            lostList.add(num + "");

        List reserveList = new ArrayList<>();
        for(int num : reserve)
            reserveList.add(num + "");

        int answer = 0;

        List allList = new ArrayList<>();
        for(int i = 0; i < n; i++)
            allList.add(i + 1 + "");

        // 당연히 체육복을 2벌 가져온 학생의 체육복이 도난을 당했다면, 여벌의 체육복을 빌려줄 수 없습니다.
        Iterator it = lostList.iterator();
        while(it.hasNext()) {
            String num = it.next();
            System.out.println(num);
            if(reserveList.contains(num)) {
                reserveList.remove(num);
                it.remove();
            }
        }

        for(int i = 0; i < allList.size(); i++) {
            String num = allList.get(i);
            if(lostList.contains(num)) {
                /* 학생들의 번호는 체격 순으로 매겨져 있기 때문에 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려주려고 합니다. */
                if(reserveList.contains((Integer.parseInt(num) - 1) + "")) {
                    lostList.remove(num);
                    reserveList.remove((Integer.parseInt(num) - 1) + "");
                    answer++;
                } else if (reserveList.contains((Integer.parseInt(num) + 1) +"")) {
                    lostList.remove(num);
                    reserveList.remove((Integer.parseInt(num) + 1) + "");
                    answer++;
                }
            } else {
                answer++;
            }
        }
        return answer;
    }

    public static void main(String args[]) {
        int[] lost = {1,2};
        int[] reserve = {1,2};
        System.out.println(solution(30, lost, reserve));
    }
}


Pain Point


체육복을 2벌 가져왔지만, 체육복을 도난당해 체육복을 빌려주지 못하는 반복문을 처리하는 부분에서 오류가 많이 발생했다.

반복문이 동작하는 동안에 List를 삭제하는 과정에서 오류가 발생

List는 앞에 있는 데이터가 삭제되면, 뒤에 데이터가 하나씩 데이터 땡겨온다

 예) index 2가 삭제되면, index 3에 위치한 데이터가 index 2에 위치하고, index 4에 위치한 데이터는 index 3에 위치 .. 반복한다.

그렇기 때문에 삭제가 정상적으로 동작하지 않는다. 이처럼 리스트를 반복하는 과정에서 데이터를 삭제할 때는 코드에 명시되어 있는 방식처럼 

iterator.remove() 를 이용해서 삭제해야 한다. Java Doc 을 확인해보니, 데이터를 삭제하는 가장 안정적인 방법이라고 명시되어 있다.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함