728x90
SMALL
프로그래머스 문제 풀이: 탐욕법 - 체육복
문제 링크: 문제 보기
문제 설명:
체육복이 없는 학생이 다른 학생으로부터 체육복을 빌릴 수 있는 최대 학생 수를 구하는 문제입니다. 빌릴 수 있는 조건은 양옆 학생이 여분의 체육복을 가지고 있는 경우로 제한됩니다.
문제 해결 코드
#include <string>
#include <vector>
using namespace std;
int arr[31]; // 학생별 체육복 상태를 저장하는 배열
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
// 모든 학생이 체육복을 하나씩 가지고 있다고 초기화
for (int i = 1; i <= n; i++) {
arr[i] = 1;
}
// 체육복을 잃어버린 학생의 체육복 수를 감소
for (int i : lost) {
arr[i]--;
}
// 여분의 체육복을 가진 학생의 체육복 수를 증가
for (int i : reserve) {
arr[i]++;
}
// 학생별로 체육복 상태를 확인하고 대여 처리
for (int i = 1; i <= n; i++) {
if (arr[i] > 0) { // 체육복이 있는 학생
answer++;
continue;
}
// 체육복이 없는 경우, 앞이나 뒤 학생에게 대여 요청
if (i > 1 && arr[i - 1] == 2) {
arr[i - 1]--; // 앞 학생의 체육복 사용
arr[i]++;
answer++;
} else if (i < n && arr[i + 1] == 2) {
arr[i + 1]--; // 뒤 학생의 체육복 사용
arr[i]++;
answer++;
}
}
return answer;
}
코드 설명
- 핵심 알고리즘: 탐욕법(Greedy)을 사용하여 각 학생이 체육복을 최적으로 빌릴 수 있도록 처리합니다. 양옆 학생을 우선적으로 확인하며 대여 여부를 결정합니다.
- 구현 세부사항:
- `arr` 배열은 각 학생이 가진 체육복의 수를 저장합니다. 초기 상태에서 모든 학생은 체육복을 1개씩 가지고 있습니다.
- `lost`에 해당하는 학생은 체육복 수를 1 감소시키고, `reserve`에 해당하는 학생은 체육복 수를 1 증가시킵니다.
- 각 학생을 순회하며 체육복이 없는 경우 양옆 학생에게 대여 요청을 처리합니다. 대여에 성공하면 대여한 학생의 체육복 수를 감소시킵니다.
- 시간 복잡도 분석:
- 체육복 상태 초기화: O(n)
- `lost` 및 `reserve` 처리: O(l + r), 여기서 l과 r은 각각 `lost`와 `reserve`의 크기
- 학생 순회 및 대여 처리: O(n)
- 총 시간 복잡도: O(n + l + r)
결과
이 코드는 주어진 입력에서 체육복을 빌릴 수 있는 최대 학생 수를 정확히 계산합니다. 탐욕법을 적용하여 간결하고 효율적으로 문제를 해결합니다.
다른 접근 방식으로, 정렬과 투 포인터를 사용하여 `lost`와 `reserve` 배열을 효율적으로 매칭하는 방법도 고려할 수 있습니다. 이 방식은 선형 탐색을 통해 불필요한 중복 검사를 줄일 수 있습니다.
728x90
LIST
'BAEKJOON > 그리디' 카테고리의 다른 글
백준 3061번 [사다리](C++) -yes6686- 티스토리 (0) | 2025.01.11 |
---|---|
백준 17224번 [APC는 왜 서브태스크 대회가 되었을까?](C++) -yes6686- 티스토리 (0) | 2025.01.06 |
백준 17509번 [And the Winner Is... Ourselves!](C++) -yes6686- 티스토리 (0) | 2024.12.31 |
백준 11399번 [ATM](C++) -yes6686- 티스토리 (0) | 2024.12.25 |
백준 11047번 [동전 0](C++) -yes6686- 티스토리 (0) | 2024.12.25 |