본문 바로가기
후추와 일상

츄르먹는 후추와 머리카락 빠질 뻔한 집사

by 윤원용 2021. 11. 14.

 

귀여운 후추를 보느라 내 다리털은 못 보겠지?

오늘은 핑계 아닌 핑계를 들고 왔다. ㅋㅋㅋ;;;

핑계는 디자인 패턴 공부를 안 하고 있는 이유???이다.

매주 토요일 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(스터디원들에게 허락 받음)

 

GitHub - YunWonYong/Programmers: 프로그래머스에서 알고리즘 문제를 풀고 소스를 저장하는 곳 입니다.

프로그래머스에서 알고리즘 문제를 풀고 소스를 저장하는 곳 입니다. Contribute to YunWonYong/Programmers development by creating an account on GitHub.

github.com

아 맞다. 이 블로그에 어떻게 들어오게 됐는??? 를 댓글에 달라주세요. 궁금하네요 ㅎㅎ;;

'후추와 일상' 카테고리의 다른 글

백신 2차 ㅂㄷㅂㄷ  (0) 2021.11.28
후추는 공부를 왜 방해하는 걸까?  (0) 2021.11.21
오늘의 후추  (1) 2021.11.11
후추는 정말 기엽다.  (1) 2021.11.09
안녕하세요. 후추에요  (0) 2021.10.30