https://www.acmicpc.net/problem/1427

 

1427번: 소트인사이드

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

function main() {
  const filePath = process.platform === "linux" ? "/dev/stdin" : "ex.txt";
  const input = require("fs").readFileSync(filePath).toString().trim();
  const result = [...input]
    .map((num) => parseInt(num))
    .sort((a, b) => b - a)
    .join("");
  console.log(result);
}

main();

Home 화면

 

Next js를 활용하여 에어비엔비 클론코딩을 시작하였다. 먼저 홈에 대한 화면 스타일링을 구축하기 위해 기본적인 틀을 만들었다. Fontawesome + tailwindcss를 활용하여 예쁘게 만들었다. 이 후 계속해서 수정해나갈예정

function calculateConstruct(value) {
  return [...value.toString()]
    .map((item) => parseInt(item))
    .reduce((acc, cur) => acc + cur, parseInt(value));
}

function main() {
  const filePath = process.platform === "linux" ? "/dev/stdin" : "ex.txt";
  const N = require("fs").readFileSync(filePath).toString().trim();

  let result = 0;
  for (let i = 0; i < N; i++) {
    const construct = calculateConstruct(i);
    if (construct === parseInt(N)) {
      result = i;
      break;
    }
  }
  console.log(result);
}

main();
const filePath = process.platform === "linux" ? "/dev/stdin" : "ex.txt";
const [N, ...ropes] = require("fs")
  .readFileSync(filePath)
  .toString()
  .trim()
  .split("\n")
  .map((item) => parseInt(item));

ropes.sort((a, b) => a - b);
let maxWeights = [];
for (let i = N; i >= 1; --i) {
  maxWeights.push(i * ropes[N - i]);
}

maxWeights.sort((a, b) => b - a);
console.log(maxWeights[0]);
const filePath = process.platform === "linux" ? "/dev/stdin" : "ex.txt";
const [firstLine, ...lines] = require("fs")
  .readFileSync(filePath)
  .toString()
  .trim()
  .split("\n");

const [N, M] = firstLine.split(" ").map((item) => parseInt(item));
let packages = [];
let pieces = [];

lines.forEach((line) => {
  const package = parseInt(line.split(" ")[0]);
  const piece = parseInt(line.split(" ")[1]);
  packages.push(package);
  pieces.push(piece);
});

packages.sort((a, b) => a - b);
pieces.sort((a, b) => a - b);

const packageCount = parseInt(N / 6);
const pieceCount = parseInt(N % 6);

const cheapPackage = packages[0];
const cheapPieces = pieces[0];

const minPrices = [
  cheapPieces * N,
  packageCount * cheapPackage + pieceCount * cheapPieces,
  (packageCount + 1) * cheapPackage,
];

minPrices.sort((a, b) => a - b);
console.log(minPrices[0]);​
const items = require("fs")
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n")
  .map((item) => parseInt(item));

const total = items.reduce((acc, cur) => acc + cur, 0);
let result = [];
for (let i = 0; i < items.length; i++) {
  for (let j = i + 1; j < items.length; j++) {
    if (total - (items[i] + items[j]) === 100) {
      result = items.filter((item) => items[i] !== item && item !== items[j]);
    }
  }
}
result.sort((a, b) => a - b);
result.forEach((item) => console.log(item));

이번 장에서는 타입시스템에 대한 요약본을 남겨두려한다. 책을 읽고 정리한거라 참고 해주면 좋을거같다

 

타입스크립트의 타입 시스템

타입 에너테이션

  • 변수나 상수 혹은 함수의 인자와 반환 값에 타입을 명시적으로 선언해서 어떤 값이 저장 될 것인지 컴파일러에게 알려주는 것

구조적 타이핑

  • 프로그래밍언어에서 값이나 객체는 하나의 구체적인 타입을 가지고 있다는 것을 구조적 타이핑이라함
  • 또 다른말로 구체화한 타입 시스템이라고도 함

구조적 서브 타이핑

타입스크립트의 타입

  • Typescript는 값의 집합 이라고도 표현함
  • 특장 값에 많은 집합에 포함될 수 있음
  • 예를 들면, 타입스크립트에서는 특정 값이 String or number 타입을 동시에 가질수도 있음

그래서 구조적 서브 타이핑이 뭔데?

  • 집합으로 나타낼 수 있는 타입스크립트의 타입시스템을 지탱하고 있는 것을 말함
  • 이름이 다른 객체라도 가진 속성이 동일하면 타입스크립트는 서로 호환이 가능함

명목적 타이핑 vs 덕 타이핑 vs 구조적 타이핑

명목적 타이핑

  • 타입의 구조가 아닌 타입의 이름만을 가지고 구별 하는 것
  • C++, Java가 대표적

덕 타이핑

  • 어떤 함수의 매개변수에 올바르게 주어지면, 그 값이 어떻게 만들어졌는지 신경쓰지 않고 사용하는 개념
  • 자바스크립트가 대표적
  • 동적 타입에 주로 사용

구조적 타이핑과 덕타이핑의 공통점

  • 객체가 가진 속성을 기반으로 타입을 검사함
  • 둘다 모두 객체 변수, 메서드 같은 필드를 기반으로 타입을 검사함

구조적 타이핑과 덕타이핑의 차이점

  • 타입을 검사하는 시점에 차이가 있음
  • 덕타이핑은 런타임에 검사를 하고, 구조적 타이핑은 컴파일 타임에 타입체커가 타입을 검사함

점진적 타입 확인

  • 컴파일 타임에 타입을 검사하면서, 필요에 따라 타입 선언 생략을 허용하는 방식
  • 타입을 지정한 변수와 표현식은 정적으로 타입으로 검사하지만, 타입선언이 생략되면 동적으로 검사를 함
  • 타입을 생략하게 되면 암시적 타입 변환이 일어남

값 vs 타입

  • 프로그램이 처리하기 위해 메모리에 저장하는 모든 데이터를 말함
  • 문자열, 숫자, 변수, 매개변수, 객체, 함수가 이에 해당함
  • 할당 연산자인 =으로 작성함

타입

  • 타입 선언(:) or 단언 문(as)으로 작성됨

값과 타입의 공통점

  • 타입스크립트에서 별도의 네임스페이스에 존재함

값과 타입 공간에 동시에 존재하는 것

  • class
  • enum

위의 2개가 런타임에서 동작하는 방식

class

  • 값 공간에서 class는 함수 값으로 동작을 함
    • 생성자 함수이기 때문에, 함수로 동작을 함

enum

  • 런타임에 객체로 변환하는 값, 런타임에 실제 객체로 존재하며, 함수로도 표현이 가능함
  • 클래스처럼 타입 공간에서 타입을 제한하는 역할, 타입스크립트 런타임에서 실제 값으로 쓰임

타입스크립트에서 자바스크리븥의 키워드가 해석되는 방식

키워드 값 타입

class Y Y
cont, let, var Y N
enum Y Y
function Y N
interface N Y
type N Y
namespace Y N

타입을 확인 하는 방법

typeof

  • 연산하기전에 피연산자의 데이터 타입을 나타내는 문자열을 반환함
  • 연산자가 반호나하는 값은 자바스크립트의 7가지 기본 데이터 타입, 호스트 객체, object 객체가 될 수 있음

typeof 값에서 쓰일 때 vs 타입에서 쓰일 때

→ typeof 연산자는 값에서 쓰일 때와, 타입에서 쓰일 때 반환값이 다르므로 주의가 필요함

값에서 쓰일 때

  • 자바스크립트 런타임의 typeof 연산자가 됨
  • 값에서 사용될 때는 자바스크립트의 typeof 연산자와 동일하게 동작함

타입에서 쓰일 때

  • 값을 읽고 타입스크립트의 타입을 반환함

instanceof

  • 프로토타입 체이닝 어딘가에 생성자의 프로토타입 속성이 존재하는지 판단할 수 있음

타입 단언

  • 타입을 강제할 수 있는 문법 이며, as 키워드를 사용하면 됨
  • 개발자가 해당 값의 타입을 더 잘 파악할 수 있을 때 사용함
  • 강제 형변환과 유사한 기능

이외

  • 타입 가드라는 패턴도 존재함

오늘부터 우아한 타입스크립트 책을 읽고 정리를 하려한다. 앞에 부분은 조금 넘어가고 타입 챕터에 대한 요약분을 남겨두겠다.

타입

자바스크립트에서의 자료형

  • undefined
  • null
  • Boolean
  • String
  • Symbol
  • Numeric(Number + BigInt)
  • Object

정적 타입 언어 vs 동적 타입 언어

정적 타입 언어

  • 모든 변수의 타입이 컴파일타임에 결정
  • Java, C, Typescript가 이에 해당함
  • 컴파일 타임에 에러를 확인함

동적 타입 언어

  • 변수 타입이 런타임에 결정됨
  • 파이썬, 자바스크립트가 대표적

암묵적 타입 + 강타입과 약타입

암묵적 타입

  • 개발자가 의도적으로 타입을 명시하거나 바꾸지 않았는데도, 컴파일러 또는 엔진 등에 의해서 런타임에 타입이 자동으로 변경되는 것을 암묵적 타입 변환이라함

강타입

  • 서로 다른 타입을 갖는 값끼리 연산 시도하면 컴파일러 or 인터프리터에서 에러가 발생함

약타입

  • 서로 다른 타입을 갖는 값 끼리 연산 할 때 컴파일러 또는 인터프리터가 내부적으로 특정 값의 타입을 반환하여 연산을 수행한 후 값을 도출함

타입스크립트의 컴파일 방식

타입스크립트가 탄생한 이유

  • 런타임에 사전에 미리 에러를 잡아내기 위하여 탄생함

그래서 타입스크립트가 컴파일하는 방식이 뭔데?

  • 타입스크립트를 컴파일하면 타입이 모두 제거된 자바스크립트의 소스코드만 있음
  • 즉, 타입스크립트는 자바스크립트에 타입이라는 레이어를 끼얹는 언어이며, 확장언어 라고도 함

+ Recent posts