
오늘은 뭘 공부할거냐면!
오전 타임에 찾아볼 것 (개인적 호기심..)
1. 부동소수점 오차,
2. Switch와 if문의 차이
3. shift(), slice() 차이
오후 타임 저녁 먹기 전까지 알고리즘 문제 풀이
4. 큐 알고리즘 문제풀이 (걍 shift() 써서 풀어야지 생각중.. 그러다 시간초과 막히면 클래스 쓸 생각)
혹은
5. 프로그래머스 1단계 문제 복습이나 못푼 것 풀기
그리고 운영체제 공부 복습
https://github.com/JaeYeopHan/Interview_Question_for_Beginner 에 나와있는 OS랑 같이 운영체제 복습 자꾸 미뤄져서 각잡고 복습할 예정.
시간이 남는다면.. 데이터 베이스 공부
https://velog.io/@dorito/부동소수점-오차-Floating-point-error
로또 번호 무작위로 뽑는 간단한 로직 만듬
const getRandomNumber = () => Math.floor(Math.random() * (45 - 1) + 1);
let answer = [];
while (answer.length < 6) {
const newNumber = getRandomNumber();
if (answer.includes(newNumber)) {
continue;
}
answer.push(newNumber);
}
answer.sort((a, b) => a - b);
console.log(answer);
answer가 mutable이라서 이 함수는 functional이 아니다. 라는 지적을 받았지만 생각이 나질 않는다... while 문에 continue도 몰랐다. ㅎ 부끄럽다
간단한 로직을 짜는데도 컴퓨팅적 사고가 전혀 안되어있다 ㅠㅠ 바로바로 안나온닿ㅎㅋㅋㅋ
미국 파워볼 로또 번호 뽑는 거 만들어보기
https://velog.io/@dorito/if문-Switch문-차이
배열에서 첫번째 항목 제거할 때 무엇이 더 유리한지 궁금해서 구글링해봤다.
자바스크립트에서는 shift(), splice() 가 첫번째 항목을 제거할 수 있다.
Shift()const array = [1, 2, 3, 4, 5, 6, 7, 8, 9];
array.shift(); // returns 1
console.log(array); // prints [2, 3, 4, 5, 6, 7, 8, 9]
splice(start, deleteCount)중요한건 splice()는 item이 아닌 배열을 반환한다.
const array = [1, 2, 3, 4, 5, 6, 7, 8, 9];
array.splice(0, 1); // returns [1]
console.log(array); // prints [2, 3, 4, 5, 6, 7, 8, 9]
splice()가 shift()보다 88퍼 느리다.

다시 말해서, shift()가 splice() 걸리는 시간의 10퍼센트밖에 되지 않는다.
따라서 shift()를 사용하는 것이 합리적이다.
https://262.ecma-international.org/5.1/#sec-15.4.4.9 에 보면 어떻게 동작하는지 나와있다.
shift()splice(0,1)여기서 핵심적으로 다른 점은 스텝 1, 2에 있다.
splice에서는 새로운 배열을 만들어서 넣어서 할당시킨다.
이전에 존재하지 않았던 속성 0의 이러한 인스턴스화 및 정의는 상대적으로 계산 비용이 많이 든다.
결론:
If all you need to do is remove the first element, always use shift() because it is much, much quicker. While splice() is a powerful method that can perform tasks like insertion and multiple extractions, it is unsuitable for this task because it instantiates and manipulates an unnecessary array.
프로그래머스 javascript 풀이
https://school.programmers.co.kr/learn/courses/30/lessons/67256
const solution = (numbers, hand) => {
let leftPoint = 10;
let rightPoint = 12;
const answer = numbers.map((input) => {
if (input === 0) {
input = 11;
}
if (input % 3 === 1) {
leftPoint = input;
return 'L'
} else if (input % 3 === 0) {
rightPoint = input;
return 'R';
} else if (input % 3 === 2) { // 2, 5, 8, 11인 경우
const leftCoordinate = coordinate(leftPoint);
const rightCoordinate = coordinate(rightPoint);
const currentCoordinate = coordinate(input);
const leftDistance = getDistance(leftCoordinate, currentCoordinate);
const rightDistance = getDistance(rightCoordinate, currentCoordinate);
if (rightDistance < leftDistance) {
rightPoint = input;
return 'R'
} else if (rightDistance > leftDistance) {
leftPoint = input;
return 'L'
} else { // 같은 경우
if (hand === 'left') {
leftPoint = input;
return 'L'
} else if (hand === 'right') {
rightPoint = input;
return 'R'
}
}
}
});
return answer.join('');
}
// 숫자의 좌표 구하기
const coordinate = (num) => {
const xAxis = (num) => {
return (num + 2) % 3;
};
};
const yAxis = (num) => {
return Math.floor((num - 1) / 3);
};
return [xAxis(num), yAxis(num)];
}
// 거리 계산
const getDistance = (arr1, arr2) => {
return Math.abs((arr1[0] - arr2[0])) + Math.abs((arr1[1] - arr2[1]));
}

거리 계산은.. 이런식으로 구상했다.
처음에 거리 계산하는 거 유클리드 거리 (피타고라스 공식 사용)해서 13번부터 쭈르륵 틀렸다.

어떻게 알았냐면..

이런 똑똑쟁이들이 질문하기란에 적어주심!
맨하탄 거리는 이렇게 구하는 거당..

const getDistance = (arr1, arr2) => {
return Math.sqrt((arr1[0] - arr2[0]) ** 2 + (arr1[1] - arr2[1]) ** 2);
}
에서
const getDistance = (arr1, arr2) => { // [1, 2], [2, 3];
return Math.abs((arr1[0] - arr2[0])) + Math.abs((arr1[1] - arr2[1]));
}
로 바꿔줬더니 맞았다~
그리고 뻘짓한 목록
1. 피타고라스 식을 sqrt(a^2 - b^2) 로 적음
2. 부등호 방향 반대로 적음
그리고 코드가 너무 더럽당.
일단 leftPoint, rightPoint 변수가 계속 바뀌는게 맘에 안들고, 계속 변수에다가 재할당을 해주는데 같은 구문이 반복되는 것도 맘에 안들고, 좌표를 설정한 것도 뭔가 ! 더럽다
아무튼 삐걱삐걱 돌아가기는 하네..의 코드
x축 좌표 구하는 코드 리팩토링함
const xAxis = (num) => {
switch (num % 3) {
case 0:
return 2;
break;
case 1:
return 0
break;
case 2:
return 1;
break;
}
}
에서
const xAxis = (num) => {
return (num + 2) % 3;
};
으로 바꿨다. 아니 당연한데 왜 몰랐지 .. 그럴 수 있음!
y축 좌표 구하는 코드도 바꿨다!
그리고 y좌표를 위아래로 뒤집는다면
로 나타낼 수 있다.
const yAxis = (num) => {
if ([1, 2, 3].includes(num)) {
return 3;
} else if ([4, 5, 6].includes(num)) {
return 2;
} else if ([7, 8, 9].includes(num)) {
return 1;
} else if ([10, 11, 12].includes(num)) {
return 0;
}
};
에서
const yAxis = (num) => {
return Math.floor((num - 1) / 3);
};
로 바꿈!
현업 개발자가 짜준 코드..
const solution = (numbers, hand) => {
const leftOrRight = hand === "left" ? "L" : "R";
const log = numbers.reduce(
(acc, cur) => {
cur = cur === 0 ? 11 : cur;
switch (cur % 3) {
case 0:
return {
...acc,
rightPosition: cur,
handPositionLog: acc.handPositionLog + "R",
};
case 1:
return {
...acc,
leftPosition: cur,
handPositionLog: acc.handPositionLog + "L",
};
case 2:
const currentLeftPosition = getPosition(acc.leftPosition);
const currentRightPosition = getPosition(acc.rightPosition);
const currentCurPosition = getPosition(cur);
const leftDistance = getDistance(
currentCurPosition,
currentLeftPosition
);
const rightDistance = getDistance(
currentCurPosition,
currentRightPosition
);
const whichHand = leftDistance - rightDistance > 0 ? "R" : "L";
return leftDistance === rightDistance
? {
leftPosition: leftOrRight === "L" ? cur : acc.leftPosition,
rightPosition: leftOrRight === "R" ? cur : acc.rightPosition,
handPositionLog: acc.handPositionLog + leftOrRight,
}
: {
leftPosition: whichHand === "L" ? cur : acc.leftPosition,
rightPosition: whichHand === "R" ? cur : acc.rightPosition,
handPositionLog: acc.handPositionLog + whichHand,
};
}
},
{
leftPosition: 10,
rightPosition: 12,
handPositionLog: "",
}
);
return log.handPositionLog;
};
const getPosition = (num) => [(num + 2) % 3, Math.floor((num - 1) / 3)];
const getDistance = (arr1, arr2) =>
Math.abs(arr1[0] - arr2[0]) + Math.abs(arr1[1] - arr2[1]);
console.log(solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left")); // "LRLLRRLLLRR"
리듀스, 삼항연산자를 이렇게 잘쓰다니!
쉽게 배우는 운영체제 2회독!
챕터 1 다 읽고 문풀 정리함
[연습문제]
옆에 같이 보면 되는 페이지도 적어둠
사용자에게 편리한 인터페이스 환경을 제공하고 컴퓨터 시스템의 자원을 효율적으로 관리하는 소프트웨어는 무엇인가?
운영체제 p.26
NOTE: 운영체제는 하드웨어(자원) 조정 관리하기 위해 존재한다. 하드웨어를 조정하고 관리하는 역할을 하므로 하드웨어 도움 없이 작동하기 어렵기 때문에 운영체제를 펌웨어라고 부르기도 한다. (소프트웨어 + 하드웨어)
가전제품과 같이 CPU의 성능이 낮고 메모리 크기도 작은 시스템에 내장하도록 만든 운영체제를 무엇이라고 하는가?
임베디드 운영체제 p.23
사용자가 원하는 기능을 수행하기 위해 컴퓨터 자원을 사용하는 소프트웨어는 무엇인가?
응용 프로그램 p.25
운영체제가 없는 컴퓨터에서는 어떤 문제가 발생하는지 설명하시오.
작동은 하지만 기능을 추가시킬 수 없다. p.28
기계와 사용자 사이에 명령을 전달하고 처리한 결과를 알려주는 것을 무엇이라고 하는가?
인터페이스 p.26, p.50
프로그램과 데이터를 한 번에 입력한 후 작업의 최종 결과만 얻는 운영체제 방식을 무엇이라고 하는가?
일괄 작업 시스템(일괄 처리 시스템) p.35
일괄 작업 시스템은 메인메모리가 운영체제 + 사용자 영역으로 나뉘어져 있다.
윈도우 운영체제가 사용하는 파일 중 부팅 시 읽는 config.sys, autoexec.bat 파일이 있는데, autoexec.bat의 확장자 .bat는 'batch job' 을 의미한다.
autoexec.bat 파일은 운영체제가 시작할 때 한꺼번에 처리해야 할 작업을 모아놓은 것이다.
프로그램이 진행되는 도중에 사용자로부터 데이터를 입력박아 프로그램 진행에 반영할 수 있는 운영체제 방식을 무엇이라고 하는가?
대화형 시스템 p.37
CPU 사용 시간을 쪼개어 여러개의 프로그램이 동시에 실행되는 것처럼 보이는 운영체제 방식을 무엇이라고 하는가?
시분할 시스템 p.40
멀티프로그래밍 수준은 동시에 실행되는 작업의 개수를 나타낸다. 멀티프로그래밍 수준이 1인 시스템을 무엇이라고 하는가?
일괄 작업 시스템(일괄 처리 시스템) p.41
멀티프로그래밍 수준이 2보다 크거나 같은 시스템을 두개 이상 쓰시오.
다중 사용자 시스템, 시분할 시스템 p.40, 41
특정 작업이 일정 시간 안에 처리되도록 보장하는 시스템을 무엇이라고 하는가?
실시간 시스템 p.40
작고 싼 컴퓨터를 네트워크로 묶어 대형 컴퓨터와 같은 일을 할 수 있도록 만든 시스템을 무엇이라고 하는가?
분산 시스템 p.41
서버 없이 말단 노드끼리 데이터를 주고받는 시스템을 무엇이라고 하는가?
P2P시스템 p.43
커널이 자신의 자원을 보호하기 위해 만든 함수의 집합을 무엇이라고 하는가?
시스템 호출 p.52
시스템 호출은 커널이 제공하는 시스템 자원의 사용과 연관된 함수이다.
응용프로그램이 하드웨어 자원에 접근하거나 운영체제가 제공하는 서비스를 이용하려 할 때는 시스템 호출을 사용해야 한다. (운영체제의 API = 시스템 호출)
NOTE: API, SDK
시스템 호출과 유사한 용어로 API (Application Programming Interface, 응용 프로그램 인터페이스), SDK(System Developer's Kit, 시스템 개발자용 키드)가 있다.
커널과 하드웨어 사이의 인터페이스를 무엇이라고 하는가?
드라이버 p.54
커널의 핵심 기능을 구현하는 모듈들이 구분없이 하나로 구성되어 있는 커널 구조를 무엇이라고 하는가?
단일형 구조 커널 p.55
커널의 기능을 최소화하여 여러컴퓨터에 이식하기 쉽게 만든 커널 구조를 무엇이라고 하는가?
마이크로 구조 커널 p.57
서로 다른 운영체제에서 하나의 응용 프로그램으로도 작동할 수 있도록 만든 시스템을 무엇이라고 하는가?
가상머신 p.58
NOTE: JVM 관련해서는 p.580에서도 나오는데, 미들웨어 개념에 대해서 알아두면 더 좋다.
[심화문제]
페이지로 표기
다했다 ~