JAVA언어의 기초/코딩테스트

[프로그래머스/Lv.1] 체육복 -JAVA

dong uk 2024. 2. 15. 20:35

 

처음 문제를 읽고 문제에 핵심이 무엇인지 생각해 보았다.

쭉 일어보고 정리가 가능한 것부터 깔끔히 하고 가보자 라는 생각으로 정리한 결과

전체 학생의 수 n

체육복을 도난당한 학생들의 번호 배열 lost

여벌의 체육복을 가져온 학생들의 번호 배열 reserve

이때 수업을 들을 수 있는 학생의 최댓값을 return 하는 문제로 해석한다.

 

일단 먼저 배열부터 정렬해 보았다.

 

체육복 여벌이 있는 학생에 대한 배열과

도난당한 학생에 대한 배열을 정렬한다.

여기서 전체 학생수 n명에서

도난당한 학생의 수만큼 빼게 되면

도난당하지 않는 학생의 수를 생각했다.

그러고 나중에 체육복을 빌리게 되었을 때 

answer값에 더하면 되지 않을까 생각했다.

 

 

 

이제 여벌 체육복을 가져왔지만 도난당했는 경우를 생각해 봤을 때

잃어버렸지만 여벌이 있기 때문에 체육복이 있는 사람으로 지정할 수 있다는 생각을 했다.

 

잃어버린 상태에서 여벌의 옷을 가지고 있는 사람은

체육복을 빌려 줄 수 없기 때문에

lost와 reserve배열에 각각 -1씩 저장한다.

또한 이 학생은 수업을 들을 수 있는 학생 임으로

answer++를 해준다.

이후 for문을 돌 필요가 없으니 break 해준다.

 

 

 

다음으론 체육복을 앞 뒤 번호만 빌려줄 수 있다는 지문을 통해

논리 연산자 OR를 써야 하는 것을 생각했고

n을 중점으로 n-1번 아이와 n+1번 중 한 명만 있으면

n번 학생은 수업을 들을 수 있다는 생각을 하게 되었다.

 

뒷번호 한 명이나 앞번호 한 명이 있으면

빌릴 수 있기 때문에

answer++를 해주고

reserve [j]에 -1을 저장한다.

그리고 더 이상의 for문을 돌릴 필요가 없기 때문에 break 해준다.

 

 

전체 코드는 이렇다.