오늘은 핑계 아닌 핑계를 들고 왔다. ㅋㅋㅋ;;;
핑계는 디자인 패턴 공부를 안 하고 있는 이유???이다.
매주 토요일 19시 30분부터 두 시간 동안 알고리즘 스터디를 한다.
프로그래머스라는 곳에서 제공하고 있는 문제 중 1 레벨 문제들을 한 주에 세 문제씩 풀고 있다.
11월 둘째 주는 모의고사, 체육복, 폰켓몬 이였다.
모의고사나 포켓몬은 많이 쉬웠지만, 체육복은 너무 막막했고 답도 없었다.
사실 체육복 문제는 문제를 이해하지도 못 했고 프로그래밍도 소 뒷걸음 하다 맞춘 격이라 통과라 하기도 뭐 하다...
(그래도 다른 사람 소스 보고 풀진 않아 나름 위안을 삼는다... ㅋㅋㅋㅋㅋ)
금요일 퇴근하고 체육복 문제를 풀기 시작했는데 토요일 스터디 시작하기 전에 겨우 java만 풀었고 js(자바스크립트)는
풀지도 못 하고 스터디를 진행했다 ㅠㅠ.....
java 코드를 js로 그대로 옮겨서 풀어도 되지만 그럼 js로 문제를 푸는 의미가 없으니 그렇게 하지 않았다.
스터디를 진행하면서 andy, 준규님의 체육복 코드를 리뷰해주실 때 이해해보려 했지만 문제를 이해한 것보다
어떻게 접근했는지가 너무 궁금해서 계속 질문한 거 같다. ㅋㅋㅋ
두 분 다 친절하셔서 상세히 가르쳐 주셔서 어느 정도 이해한 후 js로 문제를 풀 때 andy의 방식대로 풀었다.
문제를 풀이할 것이 아니기 때문에 간단히 설명하면 2차원 배열로 테이블을 만들어 0행에는 참여할 수 있는 학생의
수를 알 수 있는 배열이 있고 1행에는 잃어버린 사람들의 배열 2행에는 빌려줄 수 있는 사람들 이렇게 테이블을 만
들고 결과를 구하니까 자바로 푼 것보다 훨씬 가독성도 좋고 이해하기도 쉬웠다.
import java.util.Arrays;
public class GymSuit {
public GymSuit() {
// TODO Auto-generated constructor stub
}
public int solution(int n, int[] lost, int[] reserve) {
Arrays.sort(lost);
Arrays.sort(reserve);
int studentNum = 0;
int answer = 0;
int lostIndex = 0;
int moveLostIndex = 0;
int reserveIndex = 0;
int moveReserveIndex = 0;
while(studentNum++ < n) {
lostIndex = indexOf(lost, studentNum);
if (lostIndex > -1) {
reserveIndex = indexOf(reserve, studentNum);
if (reserveIndex > -1) {
lost[lostIndex] = 999;
reserve[reserveIndex] = 999;
answer++;
continue;
}
moveLostIndex = indexOf(lost, studentNum + 1);
if (moveLostIndex > -1) {
moveReserveIndex = indexOf(reserve, studentNum + 1);
if (moveReserveIndex > -1 && lost[moveLostIndex] == reserve[moveReserveIndex]) {
lost[moveLostIndex] = 999;
reserve[moveReserveIndex] = 999;
answer++;
studentNum++;
}
}
moveReserveIndex = indexOf(reserve, studentNum + 1);
if (moveReserveIndex > -1) {
moveLostIndex = indexOf(lost, studentNum + 1);
if (moveLostIndex > -1 && lost[moveLostIndex] == reserve[moveReserveIndex]) {
lost[moveLostIndex] = 999;
reserve[reserveIndex] = 999;
reserve[moveReserveIndex] = 999;
answer++;
studentNum++;
continue;
}
}
reserveIndex = borrow(lost[lostIndex], reserve);
if (reserveIndex > -1) {
lost[lostIndex] = 999;
reserve[reserveIndex] = 999;
answer++;
continue;
}
continue;
}
answer++;
}
return answer;
}
public int indexOf(int[] arr, int studentNum) {
int index = 0;
int range = arr.length;
do {
if (studentNum == arr[index]) {
return index;
}
}while(++index < range);
return -1;
}
public int borrow(int lostEl, int[] reserve) {
int index = 0;
int range = reserve.length;
int reserveEl = 0;
do {
reserveEl = reserve[index];
if (lostEl - 1 == reserveEl || lostEl + 1 == reserveEl) {
return index;
}
} while(++index < range);
return -1;
}
}
자바로는 이렇게 풀었고 ( 다시 봐도 똥 소스 언제 리팩터링 하나.... )
const solution = (n, lost, reserve) =>{
const arr = Array(n).fill(1);
arr.forEach((el, index) => {
let num = index + 1;
let lostIndex = lost.indexOf(num);
let reserveIndex = reserve.indexOf(num);
if (lostIndex == reserveIndex) {
return;
}
if (lostIndex > -1) {
arr[index]--;
}
if (reserveIndex > -1) {
arr[index]++;
}
});
arr.reduce((prev, next, nextIndex)=>{
if (prev === 0 && next > 1) {
arr[nextIndex - 1]++;
next--;
arr[nextIndex]--;
} else if (prev > 1 && next === 0){
arr[nextIndex - 1]--;
next++;
arr[nextIndex]++;
}
return next;
});
return arr.filter(el => el > 0).length;
};
자바스크립트는 이렇게 풀었다.
체육복 문제에 충격과 공포를 느껴 앞으로 git과 디자인 패턴 공부를 미루고 알고리즘을 해야겠다는 생각이 들었다.
비록 문제를 풀다 얼마 없는 머리카락도 전부 빠질 뻔했지만 꿀잼 주말이었다.
핑계 끝~
그리고 블로그 footer(화면 맨 아래)에 깃허브 주소는 있지만 여기다 남겨둔다.
github(스터디원들에게 허락 받음)
아 맞다. 이 블로그에 어떻게 들어오게 됐는??? 를 댓글에 달라주세요. 궁금하네요 ㅎㅎ;;
'후추와 일상' 카테고리의 다른 글
백신 2차 ㅂㄷㅂㄷ (0) | 2021.11.28 |
---|---|
후추는 공부를 왜 방해하는 걸까? (0) | 2021.11.21 |
오늘의 후추 (1) | 2021.11.11 |
후추는 정말 기엽다. (1) | 2021.11.09 |
안녕하세요. 후추에요 (0) | 2021.10.30 |