알고리즘

알고리즘 특강_1

zayn 2024. 10. 10. 20:15

"알고리즘 특강"

[ 용어소개 ]
- 컴퓨터는 작업 성능은 우수하지만 정확한명령이 없으면 일을 효율적으로 하기 힘들다.
- 개발자는 컴퓨터가 효율적으로 동작하도록 명령을 내려야 하고 이때 필요한것이 알고리즘이다.

[ 알고리즘을 왜 배워야하는가? ]
: 알고리즘은 취업, 좋은코드, 자바스크립트 학습에 도움이 된다.

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