2021년 8월 15일 광복절

대한 독립 만세!

그리고 8월 16일 월요일. 2021년도에는 대체 공휴일로 되었다.
8월 15일은 일요일이였으니 오늘은 대체공휴일이다.

그리하여, 자료구조를 어려워하는 동기들이 모여 자료구조를 정말 잘 알고 이번 섹션 2에서 엄청난 Brain분을 통해 강의를 들으며 나의 짧은 필력으로 리뷰를 한다.

좋은 코드 작성방법??


많은 분들이 오늘 강의 하는 brain 동기 분께 좋은 코드 작성하는 방법이 무엇이냐라고 물었다.

딱 정리하자면

읽히는 코드가 좋은 코드다.
이해를 못했지만, 아마 코드를 작성하면서 구동시켰을때 에러가 나지 않고
컴퓨터가 인식을 하여 구현된다면 그게 읽히는 코드인거 같다.

짧은 코드가 정답은 아니다, 줄일수 있는 건 줄이자
물론 간결하게 짧게 쓰는 경우도 있지만, 시간복잡도에 관한 문제라면
엄청 길게 써야 하는 경우가 있다.

로직을 길게해서 순차적으로 작성한다는 경우
재귀로 문제를 풀거나 자료구조에서 설명할 Stack, Queue등등 이 있겠다.


알고리즘 문제 잘 푸는 방법?

프로그래머스나 아니면 코드를 풀고 연습하는 웹사이트들이 있다.

그곳에서 대기업 기술면접시 테스트를 보는 문제들이 나오는데
그런 알고리즘 문제들을 풀때는 정말 멘붕올것이다.

문제를 천천히 읽고, 충분하게 이해하라

어떤 문제가 주어지면 처음에 무슨말이지? 하면서 못 푼다.
(작성하는 나도 똑같다..)

그런데 문제에서 요구하는 사항이 무엇인지를 차근차근 생각해본다음에
작성하면 되겠다.

알고리즘 문제에서 입출력 예시들이 있는데
그것을 Base로 해서 알고리즘 풀 때 수도코드를 작성해보면 되겠다.

원하는 값이 무엇인지, 문제에서 변수를 몇가지 쓸지, 왜 필요한지 생각해본다.

알고리즘 테스트에서는 아무의미 없이 만드는 문제는 분명 없을 것이다.

기술적으로나 새로운 것을 개발할때마다 웹 또는 앱 이용자들의 편의성을 고려하여
두뇌를 미친듯이 짜는(?) 그런 느낌으로 머리를 굴리다 보니까
여러 조건을 맞출 수 있는 그런 문제들을 통해서 웹/앱에서 정상적으로 작동될수 있게
문제를 만들었을 것이다.

(당연히... 잘하나 못하나 구분도 지을 수 있을 것이다.)

하나의 함수에서 인자를 1가지 밖에 안주어 졌을때
무엇인가 비교 할만한 대상과, 생각하지 못했던 것을을 맞닥들일때
한가지 변수가 필요한 경우가 있는데,

문제를 풀때에도 비교나, 정리 할만한 변수가 필요 할 것이다.

그렇게 코드 작성을 할때 하나의 변수를 선언해서 변수에 내용을 담고
함수 구현이 될수 있게 비교 대상할만한 코드를 작성하는 경우니까

너무 많기 보다는 간결하면서 읽히고, junior나 senior가 봐도
좋은 코드라고 말할 수 있는 정도의 변수를 만들면 되겠다.

있는 정답은 아니지만, 우리 각자가 개발을 하거나
프로젝트를 할때 잘 이루어 질 수 있게 자신만의 방식으로 만들어보면 되겠다.


자료구조에서 어려웠던 것들?

내 주관적으로는 Queue, Stack, Graph등등이 어려웠긴 했다.

문서 형식으로 된 학습 컨텐츠에서 내가 이해 못한 부분이 있는데..
더 안 찾아본 내 잘못이크다...

Stack (스택)
Stack은 쌓다, 쌓이다, 포개지다 라는 뜻으로 흔히 박스를 1단 부터 차곡 차곡 쌓는다고 보면 된다.

예를 들어 물류창고 알바를 해봤다면 한개의 파레트에 1단을 쌓을때

이렇게 쌓아 봤을 것이다.

2단도 같은 식으로 쌓고, 3단도 똑같이 쌓았을 것이다.

랩으로 칭칭 감고, 출고되는곳에서 비닐 뜯고 위에서 부터 하나씩 차근 차근
박스를 내리는 방식일 것이다.

그리고 stack은 입력과 출력이 하나의 방향으로 이루어지는 제한적 접근에 있어
먼저 들어가면 마지막에 나오고
마지막에 들어가면 먼저 나오는 식이다.

주차장 하나가 있다고 하자

(내가 그린 그림인데 못그린 그림...)

여기서 1번 차가 먼저 들어왔으니 나중에 나가는 식이고
4번차가 1번 부터 3번까지 보다 늦게 들어왔지만 나갈때는 먼저 나가는 식이다.

그래서 이걸 FILO(First In Last Out) , LIFO(Last In First Out)이라고 한다.


Queue(큐)
(※쿠에우에 아님.. 누가 쿠에우에라ㄱ...)

Queue 설명하자면 줄을 서서 기다리다, 대기 행렬 이라는 뜻이다.

먼저 들어간 데이터가 먼저 나오고 마지막에 들어간게 마지막에 나오는 경우다.
Stack과 반대로 먼저 들어간 친구가 먼저나오고 마지막에 들어온 친구가 마지막에 나가는 식이다.

예를 들어 코로나 끝났다고 가정을 해보고
코빅에 방청권이 당첨되서 tvn으로 갔는데,

녹화전에 사람들이 차례대로 줄서 있을 것이다. 그러면 그게 queue로 보면 될꺼 같다.

1번째로 온 사람이 먼저 들어가고, 마지막에 줄선사람이 마지막에 들어오는 경우겠다.
(새치기는 해당 사항 없음)

한가지 문제를 예제로 작성해서 보도록 하자

박스포장 문제

마트에서 장을 보고 박스를 포장하려고 합니다. 박스를 포장하는 데는 폭이 너무 좁아서, 한 줄로 서 있어야 하고, 들어온 순서대로 한 명씩 나가야 합니다.

불행 중 다행은, 인원에 맞게 포장할 수 있는 기구들이 놓여 있어, 모두가 포장을 할 수 있다는 것입니다. 짐이 많은 사람은 짐이 적은 사람보다 포장하는 시간이 길 수밖에 없습니다.

뒷사람이 포장을 전부 끝냈어도 앞사람이 끝내지 못하면 기다릴 수밖에 없는 환경입니다. 앞사람이 포장을 끝나면, 포장을 마친 뒷사람들과 함께 한 번에 나가게 됩니다.

만약, 앞사람의 박스는 5 개고, 뒷사람 1의 박스는 4 개, 뒷사람 2의 박스는 8 개라고 가정했을 때, 뒷사람 1이 제일 먼저 박스 포장을 끝내게 되고, 앞사람 1의 포장이 마칠 때까지 기다렸다가 같이 나가게 됩니다.

이때, 통틀어 최대 몇 명이 한꺼번에 나가는지 알 수 있도록 함수를 구현해 주세요.


입력 인자1 : box -> 배열이나 Number 타입의 요소로 되어 있다.
출력 : Number를 리턴해야 한다.

주의 사항
1. 사람은 100명 미만, 2. 박스 개수는 100개 이하

만약 5, 1, 4, 6 순으로 배열이 있다고 해보자

let box = [5,1,4,6];

여기에서 5개의 박스를 포장하는 동안 1, 4개의 박스는 포장을 끝내고 기다리게 되는데,
6개 박스는 포장 진행중으로 5,1,4 세개가 같이 나가고 6이 따로 나가게 된다.
그렇기에 최대 3명이 같이 나가게 되는 경우다.

[5, 1, 4, 6]
[4, 0, 3, 5]
[3, 0, 2, 4]
[2, 0, 1, 3]
[1, 0, 0, 2]
[0, 0, 0, 1]

첫번째 배열이 끝나면 그다음에 두번째가 진행하면 되는 것이다.
앞사람을 기다려야 해서 못나가는 상태로 계속 기다리다가
자기 보다 앞 사람이 다하면 같이 나간다. 그때 최대 수를 구하는 방식

코드 방식은 다 적지 못했지만 내가 했던 방법은 이렇게 쓰긴 했다.

일단 새벽까지 정리 하는데 여기까지만 하고
그 다음에 계속 정리 해보자

profile
드럼으로 재즈 음악하고 (Jazz drummer/ musician) 코딩공부해서 개발자가 되고 싶고(SE engineer) 바이크(Motorcycle)를 좋아해서 할리오너(harley-davidson Owner)가 되고싶은자

0개의 댓글