"알고리즘 특강"
[ 용어소개 ]
- 컴퓨터는 작업 성능은 우수하지만 정확한명령이 없으면 일을 효율적으로 하기 힘들다.
- 개발자는 컴퓨터가 효율적으로 동작하도록 명령을 내려야 하고 이때 필요한것이 알고리즘이다.
[ 알고리즘을 왜 배워야하는가? ]
: 알고리즘은 취업, 좋은코드, 자바스크립트 학습에 도움이 된다.
1) 취업에 도움이 된다.
서류 -> (코딩테스트/과제) -> 기술면접(+라이브코테) -> (문화면접) -> 최종면접 -> (레퍼체크)
코딩테스트/과제 단계는?
- 모두 생략하고 바로 기술 면접을 진행하거나
- 코딩테스트 이후 합격자에 한해 기술 면접을 진행하거나
- 과제 전형이후 합격자에 한해 기술면접을 진행하거나
- 코딩테스트 이후 합격자만 과제 전형을 진행하고, 과제를 합격하면 기술 면접으로 진행한다.
꾸준히 코딩테스트를 잘하면 생기는 장점들
- 많은 기업에서 코딩테스트를 채용전형에 포함하고 있다.
- 코딩테스트는 채용 과정 앞 부분에 위치하여 채용 프로세스 경험을 쌓는데에 중요하다.
- 코딩테스트의 유무는 지원자가 회사를 선별하는데에도 도움을 줍니다.
- 코딩테스트의 점수와 작성 방식은 이어지는 채용 단계에서도 영향을 주게 됩니다.
- 코딩테스트의 근간이 되는 알고리즘 지식은 따로 시간을 내어 학습해야만 얻을 수 있습니다.
2) 좋은 코드 작성에 도움이 된다.
- 알고리즘 학습은 효율적인 코드를 작성하는데 도움이된다.
- 학습과정에서 다른 사람들의 코드를 보면서 좋은 방법을 참고하고 나만의 스타일을 만들수있다.
3) 자바스크립트 문법 학습
[문제]
{미리알아야할 내용}
1. if (조건문) {
// 조건문 부분이 truthy한 값이면 실행
}
-> truthy & falsy 값이란?
- falsy
- `false`
- `null`
- `undefined`
- `0`
- `NaN`
- `‘’`
- truthy
- 언급한 6가지 falsy 값 외에 모든 값
- 다양한 자바스크립트 문법 사용.
2. function checkTruthiness(questionLabel, value, userGuess) {
const isTruthy = Boolean(value);
const isCorrect = isTruthy === userGuess;
console.log(`\n%c${questionLabel}`, 'color: #4287f5; font-weight: bold;');
console.log(`%c값: ${value}`, 'color: #6c757d;');
console.log(`%c실제 결과: ${isTruthy ? 'true' : 'false'}`, 'color: #28a745;');
console.log(`%c당신의 답변: ${userGuess ? 'true' : 'false'}`, 'color: #ffc107;');
console.log(`%c정답 여부: ${isCorrect ? '정답입니다!' : '틀렸습니다!'}`,
`color: ${isCorrect ? '#28a745' : '#dc3545'}; font-weight: bold;`);
console.log('%c------------------------', 'color: #6c757d;');
}
// '답변입력' 부분에 true 또는 false를 입력해 주세요
checkTruthiness('1번 문제', 0, 답변입력);
checkTruthiness('2번 문제', 'false', 답변입력);
checkTruthiness('3번 문제', null, 답변입력);
checkTruthiness('4번 문제', ' ', 답변입력);
checkTruthiness('5번 문제', [], 답변입력);
checkTruthiness('6번 문제', {}, 답변입력);
checkTruthiness('7번 문제', -1, 답변입력);
checkTruthiness('8번 문제', '', 답변입력);
checkTruthiness('9번 문제', NaN, 답변입력);
checkTruthiness('10번 문제', Infinity, 답변입력);
// 입력 예시
checkTruthiness('1번 문제', 0, true);
checkTruthiness('1번 문제', 0, false);
*주의*
// 아래의 값은 모두 truthy한 값입니다.
'false', 'null', 'undefined', '0', 'NaN', ' ', [], {}, -1 // 암살자들
*값이 truthy한지 falsy한지 콘솔에서 확인해보기*
```jsx
Boolean(확인을 원하는 값)
// 간단하게 작성하고 싶다면?
!!(확인을 원하는 값)
```
2. 논리 연산자
1) && (AND 연산자)
console.log(true && true); // true
console.log(true && false); // false
console.log(false && true); // false
console.log(false && false); // false
2)|| (OR 연산자)
console.log(true || true); // true
console.log(true || false); // true
console.log(false || true); // true
console.log(false || false); // false
[문제]
function rockPaperScissors(a, b) {
// 내용을 작성해 주세요
}
// 9가지 경우의 수 테스트
console.log(rockPaperScissors('가위', '가위') === '무승부');
console.log(rockPaperScissors('가위', '바위') === 'b 승리');
console.log(rockPaperScissors('가위', '보') === 'a 승리');
console.log(rockPaperScissors('바위', '가위') === 'a 승리');
console.log(rockPaperScissors('바위', '바위') === '무승부');
console.log(rockPaperScissors('바위', '보') === 'b 승리');
console.log(rockPaperScissors('보', '가위') === 'b 승리');
console.log(rockPaperScissors('보', '바위') === 'a 승리');
console.log(rockPaperScissors('보', '보') === '무승부');
[정답 코드_ 나]
function rockPaperScissors(a, b) {
if (a === 'rock') {
if (b === 'scissors') {
return 'A';
} else if (b === 'paper') {
return 'B';
}
} else if (a === 'scissors') {
if (b === 'rock') {
return 'B';
} else if (b === 'paper') {
return 'A';
}
} else if (a === 'paper') {
if (b === 'rock') {
return 'A';
} else if (b === 'scissors') {
return 'B';
}
}
}
[풀이코드_2]
function rockPaperScissors(a, b) {
if (a === '가위') {
if (b === '가위') return '무승부';
else if (b === '바위') return 'b 승리';
else return 'a 승리';
} else if (a === '바위') {
if (b === '가위') return 'a 승리';
else if (b === '바위') return '무승부';
else return 'b 승리';
} else {
if (b === '가위') return 'b 승리';
else if (b === '바위') return 'a 승리';
else return '무승부';
}
}
---------------------------
function rockPaperScissors(a, b) {
// 1. a가 가위인 경우
// 2. a가 바위인 경우
// 3. a가 보인 경우
}
- 이중조건문 사용으로 가독성이 좋지않음.
- return 문이 많고 내용이 중복되어서 유지보수에 불리함
[풀이코드_3]
function rockPaperScissors(a, b) {
if (a === b) {
return '무승부';
} else if (
(a === '가위' && b === '보') ||
(a === '바위' && b === '가위') ||
(a === '보' && b === '바위')
) {
return 'a 승리';
} else {
return 'b 승리';
}
}
- a가 승리하는 조건이 길어 가독성이 좋지않음
[풀이코드_4]
function rockPaperScissors(a, b) {
if (a === b) return '무승부';
return ['가위-보', '바위-가위', '보-바위'].includes(a+'-'+b) ? 'a 승리' : 'b 승리';
}
------------------------
function rockPaperScissors(a, b) {
// 1. 무승부에 대한 경우를 먼저 처리한다.
// 2. 나머지 경우의 수(a승리, b승리)를 처리한다
}
1) 가장 간단한 무승부의 경우는 별도의 if문으로 바로 처리
// if문 뒤의 실행되는 구문이 한 줄이므로 코드블록({}) 생략 가능
if (a === b) return '무승부';
2) 'a승리'와 'b승리'의 경우 삼항연산자와 배열의 includes 메서드 사용
// 코드
return ['가위보', '바위가위', '보바위'].includes(a+'-'+b) ? 'a 승리' : 'b 승리';
// 삼항연산자
// (조건) ? (조건이 true 일 때 보여줄 값) : (조건이 false 일 때 보여줄 값)
10 > 5 ? '그렇다' : '아니다' // '그렇다'
'a' !== 'a' ? '참이다' : '거짓이다' // '거짓이다'
// (조건) ? (조건이 true일 때 보여줄 값) : (조건이 false일 때 보여줄 값)
return ['가위-보', '바위-가위', '보-바위'].includes(a+'-'+b) ? 'a 승리' : 'b 승리';
// 삼항연산자에서 조건에 해당하는 코드
['가위-보', '바위-가위', '보-바위'].includes(a+'-'+b)
// includes는 배열의 요소 중 특정 값이 포함되어 있는지 검사해 true 또는 false를 반환합니다.
['a', 'b', 'c'].includes('a') // true
['a', 'b', 'c'].includes('z') // false
// 코드로 나타내면 아래와 같습니다.
// a가 승리
['가위-보', '바위-가위', '보-바위'].includes('가위-보') // true
['가위-보', '바위-가위', '보-바위'].includes('바위-가위') // true
['가위-보', '바위-가위', '보-바위'].includes('보-바위') // true
// b가 승리
['가위-보', '바위-가위', '보-바위'].includes('가위-바위') // false
['가위-보', '바위-가위', '보-바위'].includes('바위-보') // false
['가위-보', '바위-가위', '보-바위'].includes('보-가위') // false
- 삼항연산자의 조건부분의 코드는 승리한 사람을 판단하는 역할을 할 수 있다.
// (조건) ? (조건이 true일 때 보여줄 값) : (조건이 false일 때 보여줄 값)
return ['가위-보', '바위-가위', '보-바위'].includes(a+'-'+b) ? 'a 승리' : 'b 승리';
'알고리즘' 카테고리의 다른 글
Q. 2016년 (0) | 2024.10.28 |
---|---|
알고리즘 특강_4 (1) | 2024.10.15 |
알고리즘 특강_3 (0) | 2024.10.15 |
알고리즘 특강 _ 2 (3) | 2024.10.11 |