프로그래머스 체육복 JAVA 풀이 (그리디, 구현)

2026. 7. 2. 16:58·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


📌 문제 개요

점심시간에 일부 학생이 체육복을 도난당했다.

여벌 체육복을 가진 학생은 자신의 앞번호 또는 뒷번호 학생에게만 체육복을 빌려줄 수 있다.

최대한 많은 학생이 체육수업에 참여할 수 있도록 체육복을 빌려주는 문제이다.


📌 접근 방법

학생마다 체육복의 개수를 저장하는 배열을 생성하였다.

초기에는 모든 학생이 체육복을 1벌 가지고 있다고 가정한 뒤,

도난당한 학생은 1벌을 차감하고 여벌이 있는 학생은 1벌을 추가하였다.

 

이후 체육복이 없는 학생을 순서대로 확인하면서 앞 학생에게 먼저 빌릴 수 있는지 확인하고,

불가능하면 뒤 학생에게 빌려주는 그리디 방식으로 해결하였다.

마지막에는 체육복이 1벌 이상인 학생의 수를 세어 정답을 구하였다.


📌 핵심 아이디어

1. 학생 상태를 배열 하나로 관리

학생 번호를 그대로 인덱스로 사용하기 위해 n + 1 크기의 배열을 생성하였다.

모든 학생을 1벌로 초기화한 뒤 도난과 여벌을 반영한다.

int[] student = new int[n + 1];
for (int i = 1; i <= n; i++) {
    student[i] = 1;
}

for (int l : lost) {
    student[l]--;
}

for (int r : reserve) {
    student[r]++;
}

결과적으로 상태를 쉽게 관리할 수 있다.

  • 0 : 체육복 없음
  • 1 : 체육복 1벌
  • 2 : 여벌 있음

2. 앞 학생을 우선으로 빌려준다.

앞 학생에게 먼저 빌려주고, 불가능한 경우에만 뒤 학생에게 빌려준다.

현재 상황에서 가장 좋은 선택을 하는 그리디(Greedy) 전략이다.

if (p > 1 && student[p - 1] == 2) {
    student[p]++;
    student[p - 1]--;
} else if (p < n && student[p + 1] == 2) {
    student[p]++;
    student[p + 1]--;
}

3. 체육복을 가진 학생 수 계산

최종적으로 체육복이 1벌 이상인 학생의 수를 세어 반환한다.

for (int i = 1; i <= n; i++) {
    if (student[i] >= 1) {
        answer++;
    }
}

📌 전체 코드

public class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int[] student = new int[n + 1];
        int answer = 0;

        for (int i = 1; i <= n; i++) {
            student[i] = 1;
        }

        for (int l : lost) {
            student[l]--;
        }

        for (int r : reserve) {
            student[r]++;
        }

        for (int i = 1; i <= n; i++) {
            if (student[i] == 0) {
                if (i > 1 && student[i - 1] == 2) {
                    student[i]++;
                    student[i - 1]--;
                } else if (i < n && student[i + 1] == 2) {
                    student[i]++;
                    student[i + 1]--;
                }
            }
        }

        for (int i = 1; i <= n; i++) {
            if (student[i] >= 1) {
                answer++;
            }
        }

        return answer;
    }
}

📄 정리

  • 학생별 체육복 개수를 배열 하나로 관리하여 구현을 단순화했다.
  • 학생 번호를 그대로 사용하기 위해 n + 1 크기의 배열을 사용했다.
  • 앞 학생을 우선 확인한 뒤 뒤 학생을 확인하는 그리디 전략으로 해결했다.
  • 도난과 여벌 상태를 배열 값(-1, +1)으로 처리하면 코드가 간결해진다.
728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

프로그래머스 다트 게임 JAVA 풀이  (0) 2026.07.04
프로그래머스 PCCE 기출문제 10번 데이터 분석 JAVA 풀이 (구현, 정렬)  (0) 2026.07.03
프로그래머스 완주하지 못한 선수 JAVA 풀이 (HashMap, 해시)  (0) 2026.07.01
프로그래머스 분수의 덧셈 JAVA 풀이 (수학, 구현, 유클리드 호제법)  (0) 2026.06.30
프로그래머스 로또의 최고 순위와 최저 순위 JAVA 풀이 (완전탐색, 구현)  (0) 2026.06.29
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 프로그래머스 다트 게임 JAVA 풀이
  • 프로그래머스 PCCE 기출문제 10번 데이터 분석 JAVA 풀이 (구현, 정렬)
  • 프로그래머스 완주하지 못한 선수 JAVA 풀이 (HashMap, 해시)
  • 프로그래머스 분수의 덧셈 JAVA 풀이 (수학, 구현, 유클리드 호제법)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN N
      • 코테(Solved.ac + Programmers) N
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    완전탐색
    Level2
    수학
    정처기
    기출문제
    정렬
    자바
    브루트포스
    정처기실기
    자료구조
    시뮬레이션
    실기
    구현
    level0
    백준
    알고리즘
    정보처리기사
    코딩테스트
    정처기오답노트
    프로그래머스
    정보처리기사 실기 기출문제
    level1
    dp
    java
    solved.ac
    springboot
    배열
    피보나치
    백엔드개발자
    문자열
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
프로그래머스 체육복 JAVA 풀이 (그리디, 구현)
상단으로

티스토리툴바