제주 탈출 일지

[c++][python] 프로그래머스 레벨 1 - 체육복 본문

코딩 테스트

[c++][python] 프로그래머스 레벨 1 - 체육복

귀건 2020. 10. 27. 02:42
728x90
반응형

programmers.co.kr/learn/courses/30/lessons/42862?language=cpp

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

91점짜리 코드. 테스트케이스 7번에서 오류가 나는데 뭔지 모르겠다.

solution(5, vector<int>(4,5), vector<int>(3,4)) 테스트 케이스를 추가하면 오류가 난다고 뜨는데, 웹 컴파일러에서 보면 정확하게 4가 나온다. 미띤

실화?
실화?2

 

#include <string>
#include <vector>
#include <map>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    
    map<int, int> student; //학생번호, 체육복 갯수.
    
    for(int i = 1; i <= n; i++){ //학생이 가진 체육복 갯수 초기화
        student[i] = 1;
    }
    for(vector<int>::iterator iter = lost.begin(); iter != lost.end(); ++iter){ //도난당한 체육복
        student[*iter]--;
    }
    for(vector<int>::iterator iter = reserve.begin(); iter != reserve.end(); ++iter){ //여벌 체육복
        student[*iter]++;
    }
    
    for(vector<int>::iterator iter = lost.begin(); iter != lost.end(); ++iter){ //도난당한 학생 기준으로 옆을 확인
        if(*iter - 1 > 0 && student[*iter - 1] > 1){ // 2번학생부터 오른쪽을 살펴보세요. 
            student[*iter]++;
            student[*iter - 1]--;
        }
        
        if(*iter < n && student[*iter + 1] > 1){ // 왼쪽
            student[*iter]++;
            student[*iter + 1]--;
        }
    }
    
    for(int i = 1; i <= n; i++)
    {
        if(student[i] >= 1){
            answer++;
        }
    }
    
    return answer;
}

 

2021.06.03 수정)

 

python3으로 다시 풀어보았는데 바로 풀린다.

def solution(n, lost, reserve):
    answer = 0
    
    # 1 2 3 4 5
    # 1   3   5  reserve
    #   2   4    lost
    
    # 1 2 3 4 5
    #     3      reseve
    #   2   4    lost
    
    student = [1] * n
    for i in reserve:
        student[i-1] += 1
    
    for i in lost:
        student[i-1] -= 1
        
    for i in range(len(student)) :
        
        if student[i] == 0:
            if i > 0 and i < n-1 :
                if student[i+1] == 2:
                    student[i] += 1
                    student[i+1] -= 1
                elif student[i-1] == 2:
                    student[i] += 1
                    student[i-1] -= 1        
            elif i == 0:
                if student[i+1] == 2:
                    student[i] += 1
                    student[i+1] -= 1
            elif i == n:
                if student[i-1] == 2:
                    student[i] += 1
                    student[i-1] -= 1
            
    for i in student:
        if i >= 1:
            answer += 1
    
    return answer

단순히 없는 학생의 오른쪽 왼쪽을 확인하여 여분이 있는 학생의 옷을 빌린다. 이때 인덱스 오류를 막기 위해서 i = 0, i > 0 and i < n, i = n 3가지 범위로 나누어서 확인했다.(첫번째와 마지막 학생은 한쪽에만 학생이 존재하기 때문)

 

그리고 student 리스트를 확인할 때, 2개 가지고 있는 학생까지 모두 확인하여 answer를 리턴하면 된다.

728x90
반응형
Comments