TIL 👩🏻‍💻

TIL : Algorithm Basic

heesue 2021. 3. 18. 00:16

1. 수도코드

알고리즘 문제들을 풀다 보면 간단한 문제도 있지만 문제를 어떻게 해결해야 할 지 막막한 경우들이 있다. 이럴 때 코드부터 쓰는 것보다 수도코드를 쓰며 흐름을 파악할 필요가 있다. 요구사항이 하나 이상인 문제는 여러 개로 쪼개서 생각하고 어떤 개념과 연관되는지 생각해봐야 한다.


2. 코드 스타일링 : 가독성 좋은 코드를 작성하는 것

→ 코드 스타일링을 해야 하는 이유는 내 코드를 동료가 이해하지 못하는 경우를 방지할 수 있기 때문이다. 또한, 오류가 발생했을 때에도 코드 가독성이 좋아야 더 쉽게 오류를 발견할 수 있다.

 

1. 들여쓰기 : 스페이스 > 탭 (혼용 X)

 

2. 이름 짓기 : 변수명은 값의 본질적인 의미를 갖고 있어햐 한다.

- 데이터의 모음이 할당된 변수의 이름은 복수 명사가 좋다.

- boolean이 할당된 변수는 is / are을 붙인다.

- 함수의 이름은 동사로 시작하는 것이 좋다.

- 변수 할당값이 Class인 경우 주로 변수의 첫 글자는 대문자를 사용한다. (Javascript ES6 문법 - class)

- 상수는 모두 대문자로 적는다. - ex) const MAX_ITEMS_IN_QUEUE = 100

 

3. 기호 및 구두점

- Javascript의 문자열 표기 시 작은 따옴표를 권장한다. (HTML의 큰 따옴표와 구분하기 위해)

- 줄 바꿈이 필요한 문자열을 정의할 때는 `(백틱) 사용을 권장한다.

- 중괄호로 끝나는 statement(if, for, while문)는 이미 종료가 암시되었으므로 세미콜론을 사용하지 않는다.

- 함수 표현식의 끝에는 세미콜론을 사용한다.

 

4. 연산자와 키워드

- 엄격한 비교 연산자를 사용해야 한다.

- 삼항 연산자(?)는 가독성이 좋은 경우에만 사용한다.

- not 연산자(!)는 바로 앞에 붙여서 사용한다.

 

5. 짧게 쓰기 : 코드는 실행되는 한, 되도록 짧게 쓰자!

- 필요한 선언인지 고민해보자.

- boolean으로 평가되는 표현문은 바로 return한다. - ex) return A > B

 

※ 참고 사이트

google.github.io/styleguide/jsguide.html

ko.javascript.info/coding-style

 


3. 알고리즘 예제

1. 문자열을 구성하는 각 단어의 첫 글자로 이루어진 문자열을 리턴
function firstCharacter(str) {
  if (str === '') {
    return '';
  }

  let words = str.split(' ');
  let result = '';
  for (let i = 0; i < words.length; i += 1) {
    result = result + words[i][0];
  }
  return result;
}
2. 2차원 배열을 입력받아 'B'의 위치 정보를 요소로 갖는 배열을 리턴
function findBugInApples(arr) {
  for (let i = 0; i < arr.length; i += 1) {
    for (let j = 0; j < arr[i].length; j += 1) {
      if (arr[i][j] === 'B') {
        return [i, j];
      }
    }
  }
}
//2차원 배열이므로 이중 반복문을 이용해 각 배열의 요소 비교
3. 암호화된 문자열과 암호화 키를 입력받아 복호화된 문자열을 리턴
카이사르 암호는 평문을 암호키 secret개만큼 (오른쪽으로) 평행이동시켜 암호화한다.
function decryptCaesarCipher(str, secret) {
  let alpha = 'abcdefghijklmnopqrstuvwxyz';  //알파벳
  let result = '';
  for (let i = 0; i < str.length; i++) {
    if (str[i] === ' ') {
      result += ' ';  //공백은 그대로 둔다.
    } else {
      let asis = alpha.indexOf(str[i]);  //현재 문자의 알파벳 순서를 구한다.
      let tobe = (asis - secret + alpha.length) % alpha.length;
      //복호화는 반대 방향으로 이루어기 때문에 seceret을 뺀다.
      //asis < secret인 경우가 존재하므로 alpha.length를 더하고 전체를 나눠서 나머지를 구한다.
      result += alpha[tobe];
    }
  }

  return result;
}
4. 문자열에 연속되는 문자가 있는 경우, 연속 구간을 반복되는 수와 문자로 조합한 형태로 압축해 리턴
(3개 이상 연속되는 문자만 압축한다.)
function compressString(str) {
  let before = str[0];
  let count = 1;
  let result = '';
  
  str = str + ' ';
  for (let i = 1; i < str.length; i++) {
    if (before === str[i]) {  //동일한 문자가 반복될 경우
      count++;
    } else {  //이전과 다른 문자인 경우
      if (count >= 3) {  //반복된 횟수가 3 이상일 경우에만 압축을 한다.
        result = result + `${count}${before}`;
      } else {
        result = result + before.repeat(count);
      }
      before = str[i];
      count = 1;
    }
  } return result;
}

'TIL 👩🏻‍💻' 카테고리의 다른 글

TIL : 유효성 검사  (0) 2021.03.19
TIL : DOM  (0) 2021.03.18
TIL : 고차함수  (0) 2021.03.16
TIL : Twittler 목업 구현하기  (0) 2021.03.15
TIL : Javascript Koans  (0) 2021.03.12