본문 바로가기

② 심화/알고리즘

[En-Coding,이진연산] 암호를 해독하라!

728x90

문제

모든 알고리즘을 해독할 수 있는 알고리즘 7 원석를 보유한 알고리즘 제왕 파이은 죽기 전, 이 보물에 '암호'를 걸어 세계 어딘가에 묻어놨다고 공표하였다. 그가 남긴 문자는 아래와 같다.

 

섬으로 향하라!

' + -- + - + - '

' + --- + - + '

' + -- + - + - '

' + - + - + - + '

해(**1**)와 달(**0**), Code의 세상 안으로!(**En-Coding**)

 

**출력조건 : 문자열**

 

개념

- En-Coding : 코드화,암호화, 부호화를 의미한다. 사람이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 1로 변환하는 과정을 통틀어 일컫는다.

 

- 아스키코드 ASCII(American Standard Code for Information Interchange) : 아스키 코드는 미국 ANSI에서 표준화한 정보교환용 7비트 부호체계이다. 000(0x00)부터 127(0x7F)까지 총 128개의 부호가 사용된다. 이는 영문 키보드로 입력할 수 있는 모든 기호들이 할당되어 있는 부호 체계이며, 매우 단순하고 간단하기 때문에 어느 시스템에서도 적용가능하다는 장점이 있으나, 2바이트 이상의 코드를 표현할 수 없기 때문에 국제표준의 위상은 유니코드에게 넘어갔다.

 

- 유니코드 : 전 세계의 모든 문자를 다루도록 설계된 표준 문자 전산 처리 방식. 이것을 규율하는 단체는 유니코드 콘소시엄(Unicode Consortium)이다. 주요 구성 요소는 ISO/IEC 10646 Universal Character Set과 UCS, UTF 등의 인코딩 방식, 문자 처리 알고리즘 등이다. 전 세계의 모든 문자를 담는 ISO/IEC 10646 코드표를 사용함으로써, 각 언어와 문자 체계에 따른 충돌 문제를 해결하였다.

문법

for in : 상속된 열거 가능한 속성들을 포함하여 객체에서 문자열로 키가 지정된 모든 열거 가능한 속성에 대해 반복합니다. (Symbol로 키가 지정된 속성은 무시합니다.)

예제코드

 

for of  : 반복가능한 객체(Array,Map,Set,String,TypedArray,arguments객체 등을 포함)에 대해서 반복하고 각 개별 속성값에 대해 실행되는 문이 있는 사용자 정의 반복 후크를 호출하는 루프를 생성합니다.

예제코드

 

Number() : Number 객체는 숫자 값으로 작업할 수 있게 해주는 래퍼wrapper객체입니다.

  • 만약 인수를 숫자로 변환할 수 없으면 NaN을 리턴합니다.
  • 생성자로써 사용하지 않으면(new 연산자를 사용하지 않으면) Number를 사용하여 형변환을 할 수 있습니다.
new Number(value); 
var a = new Number('123'); // a === 123은 false 
var b = Number('123'); // b === 123은 true 
a instanceof Number; // true 
b instanceof Number; // false

 

typeof : 피연산자의 평가 전 자료형을 나타내는 문자열을 반환합니다.

 

instanceof : 생성자의 prototype 속성이 객체의 프로토타입 체인 어딘가 존재하는지 판별합니다.

instanceof instanceof 

String.fromCharCode() : 메서드는 UTF-16 코드 유닛의 시퀀스로부터 문자열을 생성해 반환합니다. 이 메서드는 String 객체가 아닌 문자열을 반환합니다.

 

parseInt() : 함수는 첫 번째 인자를 문자열로 변환하고 파싱하고,  그 문자열을 파싱하여 정수나NaN을 리턴합니다.

parseInt(string, radix);

parseInt(string, radix);

string :분석할 값. 만약 string이 문자열이 아니면 문자열로 변환(ToString 추상 연산을 사용)합니다. 문자열의 선행 공백은 무시합니다.

radix : Optionalstring이 표현하는 정수를 나타내는 2와 36 사이의 진수(수의 진법 체계에 기준이 되는 값). 주의하세요-기본값이 10이 아닙니다!

 

replace() : 메서드는 어떤 패턴에 일치하는 일부 또는 모든 부분이 교체된 새로운 문자열을 반환합니다. 그 패턴은 문자열이나 정규식(RegExp)이 될 수 있으며, 교체 문자열은 문자열이나 모든 매치에 대해서 호출된 함수일 수 있습니다.

const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?';

const regex = /dog/gi;

console.log(p.replace(regex, 'ferret'));
// expected output: "The quick brown fox jumps over the lazy ferret. If the ferret reacted, was it really lazy?"

 

정규표현식

/ /g === ''

/\+/g === '+'

/-/g === '-'

 

문제풀이

 

let data = [' + -- + - + - ', ' + --- + - + ',' + -- + - + - ', ' + - + - + - + '];
let result = '';

for (var str of data) {
	// 모든 공백을 없애고, +는 1로, -는 0으로 대체한다.
    console.log(str.replace(/ /g, '').replace(/\+/g, '1').replace(/\-/g, '0'));
    
    // parseInt로 문자열로 바꾼다음 이진법 숫자였다는 것을 알려주면 정수로 반환해 준다.
    console.log(parseInt(str.replace(/ /g, '').replace(/\+/g, '1').replace(/\-/g, '0'), 2));
    
    // 숫자를 문자로 변환해 주느 메서드 fromCharCode를 이용해 변환한다.
    console.log(String.fromCharCode(parseInt(str.replace(/ /g, '').replace(/\+/g, '1').replace(/\-/g, '0'), 2)));

	// 누적해 준다.
	result += String.fromCharCode(parseInt(str.replace(/ /g, '').replace(/\+/g, '1').replace(/\-/g, '0'), 2));
}

console.log(result);

 

 

728x90