hanamon.kr에서 이미지참조

 

 

ORM이란?
ORM(Object Relational Mapping)은 객체와 관계와의 설정을 의미한다.

더 자세히 말하자면, 말하는 객체(Object)는 OOP (Object_Oriented Programming)의 객체로 구현되는 클래스와 RDB (Realational DataBase)에서 쓰는 데이터인 테이블을 자동을 연결하는 것을 의미한다. 클래스와 테이블은 서로 호환가능성을 두고 만들어진 것이 아니기때문에 일치하지 않는데, 이를 ORM을 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결한다. 

 

 

ORM의 장점

 

1. 객체 제향적인 코드로 인해 더 직관적이고 비즈니스 로직에 더 집중할 수 있게 도와준다. 

  • ORM을 이용하면 SQL문이 아닌 직관적인 코드로 데이터를 조작하여, 객체 지향 프로그래밍에 집중할 수 있다. 
  • 선언문, 할당, 종료 같은 부수적인 코드를 줄일 수 있다. 
  • 각종 객체에 대한 코드를 별도로 작성하여 가독성을 높일 수 있다.
  • SQL의 절차적이고 순차적인 접근으로 객체지향적 접근만 고려되어 생산성이 증가할 수 있다. 

 

2. 재사용, 유지보수, 리팩토링이 편리하다. 

  • ORM은 기존 객체와 독립적으로 작성되어 있어, 해당 객체들은 재활용 할 수 있다.
  • 매핑정보가 명확하여 ERD를 보는 의존도를 낮출 수 있다.

 

3. DRMS (DataBase Management System)에 대한 종속성이 줄어든다. 

  • 대부분 ORM솔루션은 DB에 종속적이지 않다. (구현방법과 많은 솔루션, 자료형 타입까지 종속적이지 않다.)
  • 개발자는 객체(Object)에 집중함으로서 극단적으로 DBMS를 교체하는 큰 작업에도 리스크가 적고 소요시간도 줄어든다. 
  • 자바에서 가공할 경우 equals, hashCode의 오버라이드 같은 기능을 이용할 수 있고 빠르게 가공할 수 있다.

 

 

ORM의 단점

 

1. ORM으로만 서비스를 구현하기 어렵다. 

  • 사용하기는 편리하지만, 설계는 매우 신중하게 해야한다. 
  • 프로젝트 복잡성이 커질 경우 난이도 또한 올라가며, 부족한 설계로 속도 저하나 일관성을 무너뜨리는 문제점이 생길 수 있다.

 

2. 절차가 많은 시스템에는 ORM의 객체 지향적인 장점을 활용하기 어렵다.

  • 절차가 많은 시스템에서는 다시 객체로 바꿔야하며, 그 과정에서 생산성 저하 또는 리스크가 많이 발생할 수 있다. 

 

 

ORM과 Node.js 프레임워크

ORM은 Node.js 추상화계층의 고려해야할 가장 높은 수준의 추상화이다. ORM의 요점처럼 관계형 데이터 베이스의 데이터를 애플리케이션의 객체에 매핑하는 것이다. Node.js ORM, Sequelize는 Postgres, MySQL, MariaDB, SQLite 등을 지원하는 Promize에 기반한 비동기로 동작한다.

 

 

 

 

아래의 블로그를 참고하여 작성되었습니다. 

https://yceffort.kr/2021/07/dont-use-nodjs-orm

 

Home

yceffort

yceffort.kr

 

Node.js 프로젝트를 

활성화시키면서 자동적으로 만들어지는

"package.json"

에 대해서 알아보고자 한다.


npm 이란?

 

npm은 Node Package Manager의 약어로, 명칭 그대로 노드 패키지 매니저이다.

 

노드가 자바스크립트 프로그램을 컴퓨터에서도 실행할 수 있게 해준다. 

자바스크립트 프로그램은 패키지로 npm에 등록되어 있으며

특정 기능의 패키지가 필요하다면 npm 에서 찾아 설치하면 된다.

 

 

 

package.json

프로젝트에 필요한 패키지를 추가하다보면 패키지가 어마어마해진다.
사용하는 패키지는 저마다 고유한 버전이 있으며,
동일한 버전을 설치하지 않으면 문제가 생길수 있다. 

이때 설치한 패키지의 버전을 관리하는 파일을
package.json 이라고 한다.

 

 

 

package.json 설치하기

프로젝트를 시작하기 전에 폴더 내부에 무조건 package.json부터 만들고 시작해야 한다!

npm init -y

* -y : 모든 항목에 Yes를 한다는 의미이다.

프로젝트 이름, 설명 등을 작성하고 싶다면, 

'npm init'로 실행시키고 콘솔창에서 작성할 수 있다.

 

 

아래의 형식으로 package.json 미리보기가 나온다.

{
  "name": "프로젝트 이름",
  "version": "프로젝트 버전",
  "description": "프로젝트 설명",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "작성자 이름",
  "license": "ISC",
  }
}

 

 

 

package.json 작성시 알아두기

package name :

패키지 이름으로 Package.json의 name 속성에 저장된다. 

 

version :

패키지 버전은 SemVer의 방식의 버전 넘버링을 따라 항상 세자리로 이루어져 있다. 

 

package.json에 가장 중요한 항목은 "name" 과 "version" 이다.

이 2가지 항목을 통해 패키지 고유성을 판별하게 된다.

필수 항목이며, 해당 내용이 없으면 패키지를 설치 할 수 없다.

 

 

description :

문자열로 기입해야하며, 

npm search로 검색된 리스트에 표시되어 만들어진 패키지를 찾고 이해하는 도움을 준다. 

 

entry point :

자바스크림트 실행파일 진입점. 보통 마지막으로 module.exports를 하는 파일을 지정한다. 

package.json의 main속성에 저장된다.

 

test commend

코드 테스트 시 입력하는 명령어를 의미한다.

package.json scripts 속성안의 test 속성에 저장된다.

 

git repository :

코드를 저장해둔 깃 저장소 주소를 의미한다.

소스에 문제가 생기면 사용자들이 이 저장소에 방문에 문제를 제기하거나

코드 수정본을 올릴 수 있다. package.json repository 속성에 저장된다.

 

keywords : 키워드를 문자열 배열로 설명되며,

npm search로 검색된 리스트에 표시되어 만들어진 패키지를 찾고 이해하는 도움을 준다.

 

bugs :

프로젝트의 이슈와 버그 트레킹을 볼수있는 url 또는 이슈를 알릴 email 주소를 입력한다. 

패키지 사용자가 문제가 있을 시 도움을 줄 수 있다.

 

 license

패키지 사용자들이 만들어진 패키지를 사용하기 위해 어떻게 권한을 얻고,

어떤 금기 사항이 있는지 이해하기 위해 라이센스를 명시해야 한다. 

 

dependencies :

패키지 설치시, 패키지 이름과 함께 설치된 버전이 저장된다.  

 

devDenpendencies :

패키지 모듈을 이용하는 사람이라면, 패키지 테스트 및 문서 작성에 사용되는

외부 프레임 워크는 다운로드를 원하지 않을 것이다. 

이러한 경우, devDependencies 객체에 디펜던시를 추가하는 것도 좋은 방법이다.  

 

 

 

 

더 자세한 사항은 아래의 링크를 참조할 수 있다.

https://docs.npmjs.com/cli/v8/configuring-npm/package-json

게시글 페이지

 

프로젝트: 게시글 페이지

설명: 게시글 목록 조회, 등록, 수정 삭제의 기능 구현을 연습을 위해 제작되었습니다. 

제작: 2022.03.18 ~2022.03.24

 

시연영상: https://youtu.be/hJivoIls7AQ

깃허브: https://github.com/moonhjang/node_1

 


 

사용 기술
  • Server: AWS EC2 (Ubuntu 18.04 LTS)
  • Framework: Express, Mongoose (Node.js)
  • Database: MongoDB
  • front-end: HTML5, CSS3, Javascript, Jquery, bootstrap

 


 

핵심 기능
  • 게시글 목록조회페이지
    • 제목, 작성자명, 작성날짜 조회
    • 작성 날짜 기준으로 내림차순 정렬
    • 특정 게시글 선택시 게시글 조회페이지로 이동
  • 게시글 작성페이지
    • 제목, 작성자명, 비밀번호, 작성내용 입력 후 저장
    • 입력란이 비어있을 시, "입력해주세요" 알람띄우기
  • 게시글 조회페이지
    • 제목, 작성자명, 작성날짜, 작성 내용 조회
  • 게시글 수정/삭제페이지
    • 입력란이 비어있을 시, "입력해주세요" 알람띄우기
    • 비밀번호가 일치할 시, 수정/삭제 가능
    • 비밀번호가 일치하지 않을 시, "비밀번호 불일치" 알람띄우기

 


 

Trouble Shooting 

 

Node.js의 시스템을 완전히 이해하지 못한채 프로젝트를 진행하게 되었다. 1~2일차은 Node.js에 대해서 배웠고, 3~4일차에는 웹사이트의 백엔드 역할에 집중하였다. 5~7일차에는 프론트와 백엔드에 연결에 집중하여 프로젝트를 진행하였다. Node.js의 짧은 이해와 짧은 시간동안 프로젝트를 진행하였기에 완성도는 떨어지지만, 목표하는 기능구현은 완성하였다. 

 

▶ DB저장시, 각 포스팅에 대해서 postsid를 지정했는데, 1개 이후로 postsid 중복관련 에러가 나오면서 저장되지 않았다.

postsid를 작성날짜에 연관해서 넘버링 해주니 문제없이 저장됨

 

▶ MongoDB를 이용했을때와 다르게 Mongoose는 아이디와 비밀번호가 없어도 Robo3T에서 DB내용을 확인할 수 있었다.  하지만, 도메인과 연결 후 Robo3T에 저장된 내용과 연결되지 않고 자체 DB를 만들어 실행되었다. 어디에 저장되고 있는지 아직도 의문이 든다. DB내용 조회나 관리하기가 불편할 것같아 프로젝트 마지막날 소유하고있는 MongoDB로 경로를 변경하려고 하였음.

→ 도메인에 연결된 자체 DB는 껏다 켜도 같은 DB에 연결되어서 아직도 사용해도되는지 의문이 듦.

해당부분은 추후 스터디가 필요함.

 

▶ 비밀번호 저장시, 암호화처리가 어려웠다.

→ 게시글 작성시 암호화 처리된 비밀번호로 저장이 가능함. 하지만, 삭제 및 수정페이지에서 비밀번호 확인시 작성된 비밀번호를 암호화 시킨것과 저장된 비밀번호를 비교했을때 같은 값이 아님. 또한, 암호화 처리된 비밀번호가 '$'와 같은 기호가 있어 Schema에서 비밀번호는 'String' 지정된 상태와 달라서 오류를 냄. 또한, 비밀번호 암호화처리를 위한 충분한 시간이 없어서 추후 다시 도전할 예정임.

 

 

 

 

JavaScript에서 ES 란?

ECMASCRIPT의 약어를 뜻하며, 자바스크립트의 표준, 규격을 나타내는 용어이다.

 

모든 브라우저에서 동작할 수 있는 표준화된 자바스크립트가 필요해지면서

비영리 표준화 기구인 ECMA 인터네셔널에 자바스크립트의 표준화를 요청하였다.

 

ES5 는 2009년도에 HTML5와 함께 출연한 표준 사양이며,

ES6는 2015년에 버전업을하여 출시한 버전이다. 

ES6 이후로도 매년 업데이트가 되고 있고, 이후를 '모던 자바스크립트'라고 부른다.

 

아래에는 ES6에 포함된

let, const 키워드 /  화살표 함수 / 클래스 / 모듈 다루고 있다.

 

 


 

 

let, const 키워드

ES5

ES5의 변수 선언 방법은 var가 유일하다.

 

var :  선언과 초기화가 동시에 실행 

 

단점: 

함수 레벨 스코프 지원 → 지역변수를 전역변수로 사용남발

var키워드 생략 허용 → 암묵적 전역변수 양산

변수 중복 선언 허용 변수값의 의도치 않은 변경

변수 호이스팅  → 선언하기 이전에 참조

 

 

ES6

 var 키워드의 단점을 보완하기위해

let과 const 키워드가 도입되었다. 

 

const : 상수(변하지 않는 값, 재할당 x)

let : 재할당이 가능한 값

 

블록 레벨 스코프 지역변수{ } 에서 사용된 변수는 코드 블로내에서만 유효

변수 중복 선언 금지 →  중복 선언시, 문법에러가 발생

호이스팅 변수 선언 이전에는 참조할 수 없다. 

 

변수 선언에는 기본적으로 const를 사용하고, 

let은 재할당이 필요한 경웨 한정하여 사용하는 것이 좋다. 

 

전역 변수 (Global scope)
전역에서 선언된 변수이며, 어디에서든지 참조할 수 있다. 

지역 변수 (Local scope of Function-level scope)
지역(함수) 내에서 선언된 변수이며, 그 지역과 그지역의 하부지역에서만 참조할 수 있다.
함수 레벨 스코프 (Function-level scope) 
함수 내에서 선언된 변수는 함수 내에서만 유효, 함수 외부에서는 참조할 수 없다. 
즉, 함수 내부에서 선언변수는 지역변수 / 함수 외부에서 선언한 변수는 전역  변수

블록 레벨 스코프 (Block-level scope)
모든 코드 블록(함수 if문, for문, while문, try/catch 문 등)내에서 선언된 변수는 코드 불록 내에서만 유효, 
코드 블록 외부에서는 

 

 

 

화살표 함수(Arrow function)의 선언

 

화살표 함수는 function키워드 대신 (=>)를 사용하여 함수를 선언한다.

// 매개변수 지정 방법
    () => { ... } // 매개변수가 없을 경우
     x => { ... } // 매개변수가 한 개인 경우, 소괄호를 생략할 수 있다.
(x, y) => { ... } // 매개변수가 여러 개인 경우, 소괄호를 생략할 수 없다.

 

ES5보다  ES6의 화살표 함수는 좀더 간결하게 표현된다.

// ES5
var pow = function (x) { return x * x; };
console.log(pow(10)); // 100

// ES6
const pow = x => x * x;
console.log(pow(10)); // 100

기존의 함수와 this 바인딩이 다르며,

Lexical this를 지원하므로 콜백함수로 사용하기 편리하다.

(이 부분은 추가적으로 공부가 필요할 것같다.)

 

 

 

클래스(Class)

ES5

생성자 함수와 프로토타입, 클로저를 사용하여

객체 지향 프로그래밍을 구현하였다.

 

// ES5
var Person = (function () {
  // Constructor
  function Person(name) {
    this._name = name;
  }

  // public method
  Person.prototype.sayHi = function () {
    console.log('Hi! ' + this._name);
  };

  // return constructor
  return Person;
}());

var me = new Person('Lee');
me.sayHi(); // Hi! Lee.

console.log(me instanceof Person); // true

 

 

ES6

기존 방식보다 단순명료한 새로운 문법으로 Class함수가 추가 되었다.

 

// 클래스 선언문
class Person {
  // constructor(생성자)
  constructor(name) {
    this._name = name;
  }

  sayHi() {
    console.log(`Hi! ${this._name}`);
  }
}

// 인스턴스 생성
const me = new Person('Lee');
me.sayHi(); // Hi! Lee

console.log(me instanceof Person); // true

(디테일한 내용은 추가 공부가 필요할것같다.)

 

 

 

모듈 (Module)

모듈은 애플리케이션을 구성하는 개별적 요소로서 재사용이 가능한 코드 조각을 말한다. 

모듈은 세부 사항을 캡슐화하고 공개가 필요한 API만을 외부에 노출한다.

 

모듈은 파일단위로 분리되어 있으며 필요에 따라 모듈을 로드하여 재사용한다. 

 

script 태그에 type="module" 을 추가하면 모듈로서 동작한다. 

ES6 모듈의 파일 확장자는 모듈임을 명확하기 위해 mjs를 사용하도록 권장한다.

<script type="module" src="lib.mjs"></script>
<script type="module" src="app.mjs"></script>

 

모듈은 모듈 스코프를 가진다. 

모듈 내에서 var 키원드로 선언한 변수는 더이상 전역 변수가 아니며

window 객체 프로퍼디도 아니다.

// foo.mjs
var x = 'foo';

console.log(x); // foo
// 변수 x는 전역 변수가 아니며 window 객체의 프로퍼티도 아니다.
console.log(window.x); // undefined
// bar.mjs
// 변수 x는 foo.mjs에서 선언한 변수 x와 스코프가 다른 변수이다.
var x = 'bar';

console.log(x); // bar
// 변수 x는 전역 변수가 아니며 window 객체의 프로퍼티도 아니다.
console.log(window.x); // undefined
<!DOCTYPE html>
<html>
<body>
  <script type="module" src="foo.mjs"></script>
  <script type="module" src="bar.mjs"></script>
</body>
</html>

 

 

Export: 외부에 공개하여 다른 모듈들이 참조할 수 있게한다.

// lib.mjs
const pi = Math.PI;

function square(x) {
  return x * x;
}

class Person {
  constructor(name) {
    this.name = name;
  }
}

// 변수, 함수 클래스를 하나의 객체로 구성하여 공개
export { pi, square, Person };

 

 

Import: 모듈에서 공개한 (export)한 대상을 로드하려면 import 키워드를 사용한다.

아래의 import 3가지 방식을 참고할 수 있다.

// app.mjs
// 같은 폴더 내의 lib.mjs 모듈을 로드.
// lib.mjs 모듈이 export한 식별자로 import한다.
// ES6 모듈의 파일 확장자를 생략할 수 없다.
import { pi, square, Person } from './lib.mjs';                      // import 첫번째 방식
import * as lib from './lib.mjs';                                    // import 두번째 방식
import { pi as PI, square as sq, Person as P } from './lib.mjs';     // import 세번째 방식

console.log(pi);         // 3.141592653589793
console.log(square(10)); // 100
console.log(new Person('Lee')); // Person { name: 'Lee' }

 

 

<참고용>

lib.mjs / app.mjs / html 에서 import와 export 동작 사용방법 

// lib.mjs
export default x => x * x;
// app.mjs
// 브라우저 환경에서는 모듈의 파일 확장자를 생략할 수 없다.
// 모듈의 파일 확장자는 .mjs를 권장한다.
import square from './lib.mjs';

console.log(square(10)); // 100
<!DOCTYPE html>
<html>
<body>
  <script type="module" src="./lib.js"></script>
  <script type="module" src="./app.js"></script>
</body>
</html>

 

 

'오늘의 계절, 오늘의 노래' 라는 프로젝트를 진행하면서

JWT방식으로 로그인+회원가입을  프로그래밍을 해보았지만, 

JWT와 친해지지 않아 자세히 알아보기로 해보았다.

 


JWT 는 무엇일까?

JWT는 JSON Web Token의 약자로 전자 서명 된 URL-safe (URL로 이용할 수있는 문자 만 구성된)의 JSON입니다.

 

 

JWS (Jason Web Signature) : JSON을 암호화하여 URL-safe 문자열로 표현한 것

JWE (Jason Web Encryption) : JSON 데이터 구조를 사용하여 암호화 방법

*URL Safe : URL에 포함 할 수 없는 문자를 포함하지 않는 것

 

 

 

JWT 토큰 구성

JWT 토큰 구성은 헤어(header) + 페이로드(payload) + 서명(Signature)로 구성되며,

각 부분은  Base64로 인코딩 되어 표현된다. 

 

헤어(header) : 토큰의 유형 (JWT) +  HMAC, HS256(SHA256) 또는 RSA와 같은 해시 알고리즘을 나타낸다.

페이로드(payload) : 토큰에 담을 (name/value)를 한쌍으로 이룬 클레임(claim)정보를 나타낸다. 
                                   클레임 정보는 등록된 클레임, 공개 클레임, 비공개 클레임으로 나뉜다.

서명(Signature) : secret key를 포함하여 암호화 되어있다.

 

 

JWT Process 

- 클라이언트의 로그인 정보를 서버에 저장하지 않아, 토큰기반 인증 메커니즘을 제공한다.

- 로그아웃 시, 로컬 스토리지 저장된 JWT 데이터를 제거한다.

 

 

 JWT의 적용

  • 회원인증 : JWT의 가장 흔한 방법 
  • 정보교류 : 두 개체 사이에서 안정성있게 정보를 교환하기에 좋은 방법이다.  
                    정보가 서명되어있기 때문에, 보낸이가 바뀌진 않았는지 도중에 조작되지 않았는지 확인할 수 있다.

 

 

JWT 장점  

  • 사용자 인증에 필요한 모든 정보는 토큰 자체에 포함되어 별도 인증 저장소가 필요없다.
  • 디버깅 및 관리가 용이하다.
  • 트래픽 부담이 낮다.    
  • 독립적인 JWT

 

JWT 단점 

  • 더 많은 정보를 입력할수록 토큰이 커져 네트워크 부하를 줄 수 있다. 
  • JWT는 상태를 저장하지 않아 제어가 어렵다. 
  • 임의로 토큰을 삭제할 수 없어 '토큰 만료 시간'을 꼭 넣어주어야 한다.
  • Payload 는 암호화 한 것이 아니기 때문에
  • JWE를 암호화 하거나 Payload에 중요한 데잉터를 넣지 말아야한다.

 

 

 

 

opennaru blog, 'JWT(JSON Web Token) 이해와 활용' 참고하였습니다.

http://www.opennaru.com/opennaru-blog/jwt-json-web-token/

 

프로젝트: 오늘의 계절 오늘의 노래

설명: 계절감을 보다 감각적으로 느낄 수 있도록 봄, 여름, 가을 겨울을 만끽할 수 있는, 혹은 지나간 계절들을 떠오르게 하는 노래 추천 커뮤니티 사이트입니다. 

제작: 2022. 03. 07 ~ 2022. 03. 11

 

http://sparta-jhh.shop

시연 영상:  https://youtu.be/czaQvEnr6Ts

깃허브:  https://github.com/tayyoon/week1

 


초안

로그인페이지 (로그인을 해야 메인페이지로 넘어간다)

 

메인페이지


사용 기술
  • Server: AWS EC2 (Ubuntu 18.04 LTS)
  • Framework: Flask (Python)
  • Database: MongoDB
  • front-end: HTML5, CSS3, Javascript, Jquery, bootstrap

핵심 기능
  • 로그인/회원가입
    • 아이디 중복확인 기능
    • 회원가입시 아이디 유효성 검사
  • 메인페이지
    • 카드출력: URL, 계절, 코멘트 입력시 카드출력
    • 코멘트수정: 카드 선택시 모달화면에서 타이틀, 코멘트 입력시 해당카드 수정
    • 회원만 이용가능:  로그인한 아이디로 연결된 닉네임으로 확인가능
    • 로그아웃: 상단의 'logout' 선택시 로그아웃

Trouble Shooting

▶ 파이썬과 도메인 구동환경이 달라 도메인이용시 로그인시 메인화면으로 넘어가지 않았음

→  파이썬 이용시, "decode(utf-8)' 주석처리 / 도메인이용시,  "decode(utf-8)' 주석처리 해제로 해결

 

▶ 로그인시, 쿠키를 받아오지 못했음.

→  login.html 에 <head>와<body> 사이의 <scirpt>를 넣음으로서 해결

 

▶ 메인페이지, 반복문으로 DB의 내용을 가져오다 보니 코멘트/하트 수정시 첫 카드만 연결이 되어 수정이 불가

→ 추후에 보완이 필요한 문제

문제

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

프로그래머스 코딩테스트

 

사용한 함수 

substring() : 시작 인덱스와 종료 인덱스의 문자열을 반환한다.

let phone_number = 01023456789
hide = phone_number.substring(phone_number.length-4,0)  // 0102345
show = phone_number.substring(phone_number.length-4,phone_number.length) // 6789

 

해결

 

function solution(phone_number) {
    var answer = '';
    star = '*'
    hide = phone_number.substring(phone_number.length-4,0).length
    show = phone_number.substring(phone_number.length-4,phone_number.length);
    answer = star.repeat(hide) + show

    return answer;
}

문제
정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

 

프로그래머스 코딩테스트

사용한 함수

reduce()의 총합 구하는 함수를 참고하였다.

var sum = [0, 1, 2, 3].reduce(function (accumulator, currentValue) {
  return accumulator + currentValue;
}, 0);
var total = [ 0, 1, 2, 3 ].reduce(
  ( accumulator, currentValue ) => accumulator + currentValue,
  0
);

 

해결

 

function solution(arr) {
    var answer = 0; 
    answer = arr.reduce((a,b) => (a+b))/arr.length ;

    return answer;
}

 

 

 

 

 

문제

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 'numbers'가 매개변수로 주어집니다. 
'numbers' 에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

프로그래머스 코딩테스트

 

사용한 함수 

includes() : 괄호 내용을 포함한 값을 나타낸다. 

 

해결.

function solution(numbers) {
    var answer = 0;
    for (let i = 0; i < 10; i++) {
        if (numbers.includes(i) === true) {
            continue
        } else {       
            answer += i        
        }         
    }
    return answer;
}

 

 

 

 

해결. (다른사람의 풀이 참고)

function solution(numbers) {
    return 45 - numbers.reduce((cur, acc) => cur + acc, 0);
}

사용함수: reduce() 

45 (1~9의 총합)  -  'number'변수 내 숫자 총합을 뺀 값을 구했다. 

 

 

해결. (다른사람의 풀이 참고)

function solution(numbers) {
    let answer = 0;

    for(let i = 0; i <= 9; i++) {
        if(!numbers.includes(i)) answer += i;
    }

    return answer;
}

내가 제출한 풀이와 비슷하지만, 

표현방식이 짧아서 참고하면 좋을 것같다.

문제

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

 

프로그래머스 코딩테스트

 

사용한 함수 

중첩 if문 :  absolutes의 리스트 순서와 signs의 순서를 같게 하기위해 사용하였다.

 

 

해결

function solution(absolutes, signs) {
    var answer = 0;
    len = absolutes.length
    
    for (let i=0; i<len; i++)
        if (absolutes[i]) {
            if (signs[i] == true) {
                answer += absolutes[i]
            }else{
                answer -= absolutes[i]
            }             
        }
    
    return answer;
}

 

 

해결 (다른사람의 풀이 참고)

function solution(absolutes, signs) {

    return absolutes.reduce((acc, val, i) => acc + (val * (signs[i] ? 1 : -1)), 0);
}

사용한 함수: reduce()

 

 

 

해결(다른사람의 풀이 참고)

function solution(absolutes, signs) {
    let answer = 0;
    absolutes.forEach((v, i) => {
        if (signs[i]) {
            answer += v;
        } else {
            answer -= v;
        }
    })
    return answer;
}

사용한 함수: forEach()

 

 

 

 

해결(다른사람의 풀이 참고)

function solution(absolutes, signs) {
    let answer = 0;
    for (let i = 0; i < absolutes.length; i++) {
        signs[i] ? answer += absolutes[i] : answer -= absolutes[i]
    }
    return answer;
}

처음 보는 표현방식이라 가져왔다.

 

 

 

+ Recent posts