본문 바로가기
Algorithm

[Algorithm] 체육복

by dev_Step 2022. 6. 3.

프로그래머스[초급]

인원수 n ,  체육복을 잃어버린 배열1,  체육복의 여벌이 있는 인원 배열2 

이 주어질때, 체육복의 여벌이 있는 인원이 3번이라고 하면  체육복을 잃어버린 2,4번중 한명에서 체육복을 빌려줄수 있다

이렇게  최대 몇명이 체육복을 입을수 있는지를 나타내라

 

 

 

내 풀이

==> 나는 일단 문제를 보고 Map을 이용해서 풀면 간단하겠다라고 생각을 했었다.

 

1. 그래서 우선 map을 선언하고 맵의 키값에 n명의 숫자를 key 값으로 value값에는 체육복을 1개씩 가지고 있도록 1씩 넣어주었다.

1-1 . 이때 여벌의 체육복이 있는 인원에게는 1개씩 더 해주도록 2중 for문을 돌렸다.

 

2. 이렇게 총가지고 있는 체육복 수를 넣어주고, 잃어버린 인원을 for문을 통해서 value값에서 잃어버린사람에게는 -1 씩 해주었다.

 

3. 마지막으로 2중 for문으로 현재 체육복이 0개인 인원과 체육복이 2벌 가지고 있는 사람을 찾아서  2번 가진 사람이 1벌 가진사람에게 1개주고  (2 ->1개 ) 0벌 가지고 있는 사람은 2개인 사람에게 1벌을 받도록 하는 for문을 돌렸다.

 

4. 그리고 마지막으로 map의 key값을 ketSet()으로 받아서  value 값이 0개 이상인수(체육복이 있는사람)을 체크하여 리턴해줬다.

============================================================================================

 

더 간단한 방법으로는 

내가 생각했을때 사람과, 가지고 있는 수 를 모두 저장해야하니 Map을 사용해야 한다고 생각했는데

그냥 1차원 배열을 사용해도 됬다

왜냐하면 

결국 n인원수 이므로,  1차원배열을 통해서 

st[0] = 1 ,st[1] = 2, -----st[n] = n+1 로 관리를 해도 되었다.

 

for문을 돌리면서 우선 student 요소가 0인것을 고르고,

student[i-1] = 2 일때 조건이 있는데 만약 i 가 0이 들어가면 배열의 길이 에러가 발생하므로

>>> i>0 조건이 추가되었고

student[i+1]==2 의 경우 i 가 4일경우 stduent[5]가 되므로 배열의 길이가 넘어가므로 i < n-1 조건이 붙었다.

그리고 마지막에

해당 조건에 포함되지 않는 경우는 0이고, i+1, i-1 해도 받을수 있는경우가 아니므로 answer-- 해주면

결국 못받는 인원의 숫자가 5-answer 되므로  해당 값을 리턴해주면된다.