https://school.programmers.co.kr/learn/courses/30/lessons/42862#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
먼저 문제를 보면 중요하다고 생각한 요소는
| 체육수업을 들을 수 있는 학생의 최댓값을 return 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다 |
이에 lost를 기준으로 reserve에 앞뒤 번호가 있는지 찾거나
reserve를 기준으로 앞뒤로 lost에 번호가 있는지 찾을 수 있다고 생각했고
lost를 기준으로 하기로 생각하였다.
또한 count라는 변수를 만들어 체육복을 입을 수 있게 된 학생을 관리해
전체학생수에서 도난당한 학생 수를 빼고 count를 더해 학생수를 구하겠다고 생각하였다.
1.첫번째 코드
class Solution {
//체육수업을 들을 수 있는 학생의 최댓값을 return
//바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다
public int solution(int n, int[] lost, int[] reserve) {
//lost의 앞뒤로 reserve를 찾기
//or
//reserve 앞뒤로 lost찾기
int count = 0;
for(int i = 0; i<lost.length; i++){
for(int k =0; k< reserve.length; k++){
if(lost[i] - 1 == reserve[k]){
count++;
reserve[k] = 0;
break;
}
if(lost[i] +1 == reserve[k]){
count++;
reserve[k] = 0;
break;
}
}
}
int answer = n - lost.length + count;
return answer;
}
}
그러나 많은 부분에서 오류가 났고 다시 문제를 읽으며
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
를 보게 되엇다.
이 제한 사항 이전의 제한 사항이 너무 뻔한거라 마지막 제한사항을 읽지 않았다.;
제한사항을 꼼꼼히 읽어야 한다고 느끼게 되었다.
2번째 코드
class Solution {
//체육수업을 들을 수 있는 학생의 최댓값을 return
//바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다
public int solution(int n, int[] lost, int[] reserve) {
//lost의 앞뒤로 reserve를 찾기
//or
//reserve 앞뒤로 lost찾기
int count = 0;
//여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.
// 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며,
// 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
// 5 [2,4] [2,3,5]
for(int i = 0; i<lost.length; i++){
for(int k =0; k< reserve.length; k++){
if(lost[i] == reserve[k]){ //여벌있는데 도난당한 학생
count++;
lost[i] = -1;
reserve[k] = -1; // [2,4] [2,3,5] -> [-1,4] [-1, 3, 5]
break;
}
}
}
for(int i = 0; i<lost.length; i++){
for(int k =0; k< reserve.length; k++){
if(lost[i] - 1 == reserve[k]){
count++;
reserve[k] = -1;
break;
}
if(lost[i] +1 == reserve[k]){
count++;
reserve[k] = -1;
break;
}
}
}
int answer = n - lost.length + count;
return answer;
}
}

다 통과하는데 2개의 경우만 통과 하지않았다.
여기서부터 난관이었는데
고칠만한게 배열을 정렬하는것밖에 없어 보여 이건가? 하며 정렬을 넣어주었다.
import java.util.ArrayList;
import java.util.Collections;
class Solution {
//체육수업을 들을 수 있는 학생의 최댓값을 return
//바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다
public int solution(int n, int[] lost, int[] reserve) {
//lost의 앞뒤로 reserve를 찾기
//or
//reserve 앞뒤로 lost찾기
ArrayList<Integer> lostList = new ArrayList<>();
ArrayList<Integer> reserveList = new ArrayList<>();
for(int i:lost){
lostList.add(i);
}
for(int i:reserve){
reserveList.add(i);
}
Collections.sort(lostList);
Collections.sort(reserveList);
int count = 0;
//여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.
// 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며,
// 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
// 5 [2,4] [2,3,5]
for(int i = 0; i<lostList.size(); i++){
if(reserveList.contains(lostList.get(i))){
reserveList.remove(lostList.get(i));
lostList.remove(i); // 5 [2,4] [2,3,5] -> [4] [3,5]
}
}
for(int i = 0; i< lostList.size(); i++){
for(int k =0; k< reserveList.size(); k++){
if(lostList.get(i) - 1 == reserveList.get(k) || lostList.get(i) + 1 == reserveList.get(k)){
reserveList.remove(k);
count++;
break;
}
}
}
int answer = n - lostList.size() + count;
return answer;
}
}

그러니 이전의 두개가 해결되었지만 뭔가 다른게 오류가 났다.;
로직을 검사하면서 여벌을 가져왔지만 도난 당한 경우의 학생을 처리하는데 remove를 사용하면서
인덱스가 당겨지며 오류가 발생한다는 것을 알게 되어 수정하게 되었습니다.
import java.util.ArrayList;
import java.util.Collections;
class Solution {
//체육수업을 들을 수 있는 학생의 최댓값을 return
//바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다
public int solution(int n, int[] lost, int[] reserve) {
//lost의 앞뒤로 reserve를 찾기
//or
//reserve 앞뒤로 lost찾기
ArrayList<Integer> lostList = new ArrayList<>();
ArrayList<Integer> reserveList = new ArrayList<>();
for(int i:lost){
lostList.add(i);
}
for(int i:reserve){
reserveList.add(i);
}
Collections.sort(lostList);
Collections.sort(reserveList);
int count = 0;
//여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.
// 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며,
// 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
// 5 [2,4] [2,3,5]
for(int i = 0; i<lostList.size();){
if(reserveList.contains(lostList.get(i))){
reserveList.remove(lostList.get(i));
lostList.remove(i); // 5 [2,4] [2,3,5] -> [4] [3,5]
}
else{
i++;
}
}
for(int i = 0; i< lostList.size(); i++){
for(int k =0; k< reserveList.size(); k++){
if(lostList.get(i) - 1 == reserveList.get(k) || lostList.get(i) + 1 == reserveList.get(k)){
reserveList.remove(k);
count++;
break;
}
}
}
int answer = n - lostList.size() + count;
return answer;
}
}
문제를 꼼꼼히 읽어봐야 한다!를 뼈져리게 느꼈고 자바를 많이 잊어 기본기가 많이 떨어졌다는 것이 느껴졌다.
'프로그래머스' 카테고리의 다른 글
| 99클럽 코테 스터디 6일차 TIL 기사단원의 무기(약수 구하기) (0) | 2024.04.03 |
|---|---|
| 99클럽 코테 스터디 5일차 TIL 피보나치수열 (0) | 2024.04.02 |
| 99클럽 코테 스터디 4일차 TIL 햄버거 만들기 문제(ArrayList remove vs Stack pop) (0) | 2024.04.01 |
| 99클럽 코테 스터디 3일차 TIL 크기가 작은 부분 문자열(int, long의 범위) (0) | 2024.03.31 |
| 99클럽 코테 스터디 2일차 TIL 숫자 문자열과 영단어 (1) | 2024.03.30 |