코딩굼벵이
구르는 중
코딩굼벵이
  • 분류 전체보기 (116) N
    • [C_C++]이론 공부 (17)
      • 알고리즘 (11)
      • 이론+STL (6)
    • [C_C++]코딩테스트 연습 (45)
      • [프로그래머스] level 1 (26)
      • [프로그래머스] level 2 (5)
      • [백준] 일반 문제 (12)
      • 기타 (2)
    • Solana (28)
      • Documentation (9)
      • Validator - 공부 (10)
      • Validator - 실행 (devnet & te.. (6)
      • 그 외 (3)
    • React (4)
    • Linux (2)
    • Javascript (2)
    • 블록체인 기반 핀테크 및 응용 SW 개발 (8)
      • React (1)
      • Javascript (3)
      • Solidity (3)
      • 프로젝트 (1)
    • 기타 (10) N

블로그 메뉴

  • 🌟 깃허브
  • 🌿 Portfolio(2021)
  • 홈
  • 태그
  • 방명록

티스토리

최근 글

태그

  • Immer #ContextAPI
  • 모니터링
  • grafana
  • 솔라나
  • Hooks #React
  • 밸리데이터

인기 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
코딩굼벵이

구르는 중

[C++] 프로그래머스 - 체육복 (그리디)
[C_C++]코딩테스트 연습/[프로그래머스] level 1

[C++] 프로그래머스 - 체육복 (그리디)

2022. 8. 25. 11:40
728x90

그리디의 대표 문제 중 하나인 체육복이다.

 

프로그래머스

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

programmers.co.kr

 

 

 

문제 요약

전체 학생 n(2~30)명 중 체육복을 도난당한 학생들(lost)이 있다. 체육복이 없는 학생의 앞뒤 번호 중 여벌을 가져온 학생(reserve)이 있으면 체육복을 빌린다. 도난은 1개씩만 당하며, 여벌을 가져온 학생도 도난 당해서 여벌이 없어졌을 수 있다. 이렇게 빌려서 수업을 들을 수 있는 학생 수의 최대값을 반환하면 된다.

내 풀이

학생수만큼 각 번호에 1을 담은 배열을 두고, 도난을 당했으면 1을 빼고 여벌을 가져왔으면 1을 더해준다.
lost를 정렬한 다음, 도난당한 학생의 앞번호가 여벌을 가져왔으면 빌리고, 뒷번호만 가져왔으면 뒷번호에게 빌린다.
다 빌린 다음 배열에 0이 아닌 값(1,2)이 들어있는 학생수만큼 세서 반환했다.

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int stu[31];

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer=0;
    for(int i=1; i<=n; i++) {
        stu[i]++;
    }
    sort(lost.begin(), lost.end());
    for(int i=0; i<lost.size(); i++) {
        if(lost[i]) stu[lost[i]]--;
    }
    for(int i=0; i<reserve.size(); i++) {
        if(reserve[i]) stu[reserve[i]]++;
    }
    for(int i=0; i<lost.size(); i++) {
        if(!stu[lost[i]]) {
            if(stu[lost[i]-1]==2) {
                stu[lost[i]-1]--, stu[lost[i]]++;
            } else if(stu[lost[i]+1]==2) {
                stu[lost[i]+1]--, stu[lost[i]]++;
            }
        }
    }

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

    return answer;
}

 

다른 사람 풀이

푸는 방식은 비슷한데, 학생수만큼 배열에 1을 넣는 과정 없이 lost 번호의 배열에 -1, reserve 번호의 배열에 1을 넣었다.
그리고 정렬 후 lost 배열을 검사했던 나와 달리, 정렬하는 과정 없이 그냥 모든 학생을 검사해 체육복을 빌리는 과정을 수행했다.

#include <string>
#include <vector>

using namespace std;
int student[35];
int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    for(int i : reserve) student[i] += 1;
    for(int i : lost) student[i] += -1;
    for(int i = 1; i <= n; i++) {
        if(student[i] == -1) {
            if(student[i-1] == 1) 
                student[i-1] = student[i] = 0;
            else if(student[i+1] == 1) 
                student[i] = student[i+1] = 0;
        }
    }
    for(int i  = 1; i <=n; i++)
        if(student[i] != -1) answer++;

    return answer;
}
저작자표시 비영리 변경금지 (새창열림)

'[C_C++]코딩테스트 연습 > [프로그래머스] level 1' 카테고리의 다른 글

[C++] 프로그래머스 - 부족한 금액 계산하기  (0) 2021.09.08
[C++] 콜라츠 추측 - 3번째 기본 예제, 13번 주의  (0) 2021.07.30
[C++] 프로그래머스 - 이상한 문자 만들기  (0) 2021.07.30
[C++] 프로그래머스 - 시저 암호  (0) 2021.07.23
[C++] 프로그래머스 - 소수 찾기  (0) 2021.07.23
    '[C_C++]코딩테스트 연습/[프로그래머스] level 1' 카테고리의 다른 글
    • [C++] 프로그래머스 - 부족한 금액 계산하기
    • [C++] 콜라츠 추측 - 3번째 기본 예제, 13번 주의
    • [C++] 프로그래머스 - 이상한 문자 만들기
    • [C++] 프로그래머스 - 시저 암호
    코딩굼벵이
    코딩굼벵이
    구르는 재주 연마 중

    티스토리툴바