문제

천나라 민호성의 지영 공주님은 매우 아름답다. 공주님 자신도 이 세상 그 누구보다 자신이 아름답다는 것을 알고 있다. 공주님은 자신의 아름다움이 세월의 저편으로 사라지는 것을 매우 두려워한다. 그래서 하루에도 수십 수백 번씩 거울을 보며 자신의 모습이 여전히 아름다운지 확인을 거듭한다. 그러던 어느 날, 세상의 다양한 장면들을 담고 싶었던 공주님의 마법거울은 매일 똑같은 모습만을 비추는 자신의 운명에 좌절하며 앞으로의 운명을 개척하기로 결심했다. 마법거울은 매일 자신의 심리상태에 따라 거울에 비친 공주님의 모습을 좌/우 또는 상/하로 반전시켜 비추기로 한다. 마법거울의 심리상태는 1부터 3까지의 자연수로 표현할 수 있으며, 숫자가 클수록 더 화가 난 상태를 의미한다. 마법거울의 심리상태가 1일 때는 지영 공주님의 모습을 있는 그대로 표현하고, 2일 때는 좌/우로 반전된 모습을, 3일 때는 상/하로 반전된 모습을 표현한다. 정사각형 형태의 마법거울의 크기와 거울에 비친 지영 공주님의 원래 모습, 마법거울의 심리상태가 주어졌을 때, 마법거울에 비친 지영 공주님의 모습을 출력하라.

 

입출력 예시

 

해결

const fs = require('fs');

const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `8
OOOOOOOO
OKKOOEEO
OKKOOEEO
OOOSSOOO
OOOSSOOO
OAOOOOAO
OOAAAAOO
OOOOOOOO
3`
).match(/[^\r\n]+/g);

const s = stdin
const state = Number(s[s.length-1])
let answer = [];

// 1일때 그대로
if (state == 1){
  for (let i=1; i<s.length-1; i++){
    console.log(s[i])
  }

// 2일때 좌우반전
} else if (state == 2){
  for (let i=1; i<s.length-1; i++){
    const letter = s[i].split('')
    for (let j=letter.length-1; j>=0; j--){
      if (j == letter.length-1){
        answer.push([letter[j]])
      } else {
        answer[answer.length-1].push(letter[j])
      }
    }
  }

// 3일때 상하반전
} else {
  for (let i=s.length-2; i>0; i--){
    console.log(s[i])
  }
}

console.log(answer.join('\n').replace(/,/g,''))

'개발 공부 > Algorithm' 카테고리의 다른 글

[백준/Node.js] 가뭄(Small)  (0) 2023.03.29
[백준/Node.js] 시간과 날짜  (0) 2023.03.25
[백준/Node.js] 주사위 네개  (0) 2023.03.24
[백준/Node.js] 오늘도 졌다  (0) 2023.03.23
[백준/Node.js] 블랙잭  (0) 2023.03.22

1. 클래스 생성자 매써드 - 매개변수

// 매개변수 미리 선언하기
class Car {
    color: string; // 아래의 생성자매서드에 사용된다면, 미리 선언을 해줘야 한다.

    constructor(color: string) {
        this.color = color;
    }
}

// 또는, 생성자 매서드의 매개변수에 'public' 또는 'readonly' 
class Car {
    constructor(public color: string) {  
        this.color = color;
    }
}

const bmw = new Car("red")

 

 

2. 접근 제한자 (Access modifier) : public

// Car클래스
class Car {
    name: string = "car"  // public name: string = "car" 와 동일
    color: string;
    constructor(color: string) {
        this.color = color;
    }
    start() {
        console.log("start")
    }
}

// 자식클래스
class Bmw extends Car {   
    constructor(color: string) {
        super(color);
    }
    showName() {
        console.log(super.name)  // 자식클래스에서 사용가능
    }
}

const z4 = new Bmw("black")  // 클래스 인스턴스 접근 가능

 

 

3. 접근 제한자 (Access modifier) : private

// Car클래스
class Car {
    private name: string = "car"  // #name: string = "car" 와 동일
    color: string;
    constructor(color: string) {
        this.color = color;
    }
    start() {
        console.log("start")
        console.log(this.name)   // Car 클래스에서만 내부에서만 사용가능(자식클래스에서 사용불가)
                                 // console.log(this.#name)로도 표현 가능
    }
}

 

 

4. 접근 제한자 (Access modifier) : protected

class Car {
    protected name: string = "car" 
    color: string;
    constructor(color: string) {
        this.color = color;
    }
    start() {
        console.log("start")
    }
}

// 자식클래스
class Bmw extends Car {   
    constructor(color: string) {
        super(color);
    }
    showName() {
        console.log(super.name)  // 자식클래스에서 사용가능
    }
}

const z4 = new Bmw("black")
console.log(z4.name) // 에러발생: 클래스 인스턴스로 접근 불가

 

 

5. static 정적 멤버 변수

// static 정적 멤버 변수
class Car {
    name: string = "car";
    static wheels = 4;

    start() {
        console.log("start")
        console.log(this.name)
        console.log(Car.wheels)  // static을 사용할때는, this가 아닌 Class명을 적어야한다.
    }
}

console.log(Car.wheels)

 

 

6. 추상 클래스

abstract class Car {
    color: string;
    constructor(color: string) {
        this.color = color
    }
                  
    abstract doSometing():void // 상속받는 곳에서 '구체적인 기능'을 구현해주어야 함
}

// const car = new Car("red")  // 오류 발생: 추상 클래스는 new를 이용해서 객체를 만들 수 없음

class Bmw extends Car {        // 오직 상속을 통해서만 객체를 만들 수 있음
    constructor(color: string) { 
        super(color);
    }

    doSomething(){             // 상속받는 곳에서 '구체적인 기능'을 구현해줌
        alert(3)
    }
}

const z4 = new Bmw("black")

 

문제

가뭄에 찌든 신촌을 위해서 국렬이는 세 칸으로 구성되어 있는 신촌에 비를 내릴 것이다. 그러나 국렬이는 무능해서 각 칸마다 비를 내리지 못하고, 두 칸에 동일하게 비를 내리는 것만 할 수 있다.

1번째 칸, 2번째 칸에 동시에 뿌리는 비의 강수량을 a cm, 1번째 칸, 3번째 칸에 동시에 뿌리는 비의 강수량을 b cm, 2번째 칸, 3번째 칸에 동시에 뿌리는 비의 강수량을 c cm라고 하자. a, b, c는 모두 양의 실수여야 한다. 가뭄에 찌든 신촌이라도 비가 너무 많이 오면 상당히 곤란하고, 비가 너무 조금 와도 곤란하다. 그래서 각 칸에 해당하는 지역은 강수량이 정확히 di cm가 되어야 한다. 이때 정확한 a, b, c의 값을 구하여라.

 

입출력 예시

 

해결

const fs = require('fs');

const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `5 8 6`
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();

const [d1,d2,d3] = input().split(' ').map(Number)

// d1 = a+b, d2 = a+c, d3 = b+c
// d1 + d2 = a+b+a+c 
// d1 + d2 = 2a + d3
// d1 + d2 - d3 = 2a
// d1 + d2 - d3 / 2 = a

const a = (d1 + d2 - d3) / 2
const b = (d1 + d3 - d2) / 2 
const c = (d2 + d3 - d1) / 2


let isSuccess = 1;
if (a <= 0 || b <= 0 || c <= 0){
  isSuccess = -1
}

console.log(isSuccess)
isSuccess > 0 ? console.log(a.toFixed(1),b.toFixed(1),c.toFixed(1)): null;

문제

어느 날 시계를 본 경근이는 시간이 8시 14분인 것을 보고 놀랐다. 왜냐하면 그의 생일은 8월 14일이기 때문이다. 그리고 이 경험을 바탕으로 다음과 같은 문제를 만들었다:

두 정수 x, y가 주어질 때, x y분으로 읽는 것이 가능한지의 여부를 판단하면서, x y일로 읽는 것이 가능한지의 여부를 판단하는 프로그램을 작성하라.

시는 0시에서 23시까지, 분은 0분에서 59분까지가 유효하며, 월은 1월에서 12월까지가 유효하다. 1월, 3월, 5월, 7월, 8월, 10월, 12월은 1일에서 31일까지가 유효하고, 4월, 6월, 9월, 11월은 1일에서 30일까지가 유효하며, 2월은 1일에서 29일까지가 유효하다.

 

입출력 예시

 

해결

const fs = require('fs');

const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `3
8 14
0 29
0 0` 
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();

const s = Number(input())
const days = [31,29,31,30,31,30,31,31,30,31,30,31]
let answer = []

while (true){
  const v = input()
  if (!v) break;
  const [hr, min] = v.split(' ').map(Number)
  
  if ( hr >= 0 && hr <= 23 && min >= 0 && min <= 59){
    if ( hr >= 1 && hr <= 12 && min >= 1 && min <= days[hr-1]){
      answer.push(`Yes Yes`)
    } else {
      answer.push(`Yes No`)
    }
  } else {
    if ( hr >= 1 && hr <= 12 && min >= 1 && min <= days[hr-1]){
      answer.push(`No Yes`)
    } else {
    answer.push(`No No`)
    }
  }
}

console.log(answer.join('\n'))

1. 문자열(리터럴) 타입

const userName1 = "Bob"    // 변경되지 않는 변수 선언
let userName2: string | number = "Tom"  // 이후 변수를 변경

 

 

2. 유니온 타입 : 자바스크립트의 OR 연산자 || 

interface Car {
  name: "car";
  color: string;
  start(): void;
}

interface Mobile {
  name: "mobile";
  color: string;
  call(): void;
}

// 식별가능한 유니온 타입
function getGift(gift: Car | Mobile) {
  if (gift.name === "car"){
    gift.start()
  } else {
    gift.call()
  }
}

 

 

3. 교차파입 : 여러타입을 합쳐서 사용

interface Car {
  name: string;
  start(): void;
}

interface Toy {
  name: string;
  color: string;
  price: number;
}

const toyCar: Toy & Car = {
  name: "타요",
  start(){},
  color: "blue",
  price: 1000
}

문제

1에서부터 6까지의 눈을 가진 4개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.

  1. 같은 눈이 4개가 나오면 50,000원+(같은 눈)×5,000원의 상금을 받게 된다. 
  2. 같은 눈이 3개만 나오면 10,000원+(3개가 나온 눈)×1,000원의 상금을 받게 된다. 
  3. 같은 눈이 2개씩 두 쌍이 나오는 경우에는 2,000원+(2개가 나온 눈)×500원+(또 다른 2개가 나온 눈)×500원의 상금을 받게 된다.
  4. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다. 
  5. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.  

예를 들어, 4개의 눈이 3, 3, 3, 3으로 주어지면 50,000+3×5,000으로 계산되어 65,000원의 상금을 받게 된다. 4개의 눈이 3, 3, 6, 3으로 주어지면 상금은 10,000+3×1,000으로 계산되어 13,000원을 받게 된다. 또 4개의 눈이 2, 2, 6, 6으로 주어지면 2,000+2×500+6×500으로 계산되어 6,000원을 받게 된다. 4개의 눈이 6, 2, 1, 6으로 주어지면 1,000+6×100으로 계산되어 1,600원을 받게 된다. 4개의 눈이 6, 2, 1, 5로 주어지면 그 중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.

N(1 ≤ N ≤ 1,000)명이 주사위 게임에 참여하였을 때, 가장 많은 상금을 받은 사람의 상금을 출력하는 프로그램을 작성하시오.

 

입출력 예시

 

해결

const fs = require('fs');
const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `1
3 2 3 2` 
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();


const s = Number(input())

let i = 0
let sum = 0;

while (i < s) {
  const num = input().split(' ').map(Number).sort((a,b) => a-b)

  num.map((e) => {
    const cnt = num.filter((item) =>  e == item)

    if (cnt.length == 4){
      sum = 50000 + (cnt[0]*5000) > sum ? 50000 + (cnt[0]*5000): sum
    } else if (cnt.length == 3){
      sum = 10000 + (cnt[0]*1000) > sum ? 10000 + (cnt[0]*1000): sum
    } else if (cnt.length == 2){
      if (num[0] == num[1] && num[2] == num[3]){
        sum = 2000 + (num[0]*500) + (num[2]*500) > sum ? 2000 + (num[0]*500) + (num[2]*500) : sum
      } else {
        sum = 1000 + (cnt[0]*100) > sum ? 1000 + (cnt[0]*100) : sum
      }
    } else if (cnt.length == 1){
      const big = Math.max(...num)
      sum = (big*100) > sum ? (big*100): sum 
    }
  })

  i++;
}

console.log(sum)

'개발 공부 > Algorithm' 카테고리의 다른 글

[백준/Node.js] 가뭄(Small)  (0) 2023.03.29
[백준/Node.js] 시간과 날짜  (0) 2023.03.25
[백준/Node.js] 오늘도 졌다  (0) 2023.03.23
[백준/Node.js] 블랙잭  (0) 2023.03.22
[백준/Node.js] 직각 삼각형의 두 변  (0) 2023.03.21

1. 함수 작성

const add = (num1: number, num2: number):void => {
  console.log(num1 + num2)
}

 

 

2. 선택적 매개변수

const hello = (name?: string) => {
  return `Hello, ${name || 'world'}`
}

hello() // Hello, world
hello('purple') // Hello, purple

 

 

3. 매개변수 옵션값

// 옶션값이 뒤에 있는 경우
const hello = (name: string, age?: number): string => {
 if (age !== undefined) {
  return `Hello, ${name}. You are ${age}.`;
 } else {
  return `Hello, ${name}.`;
 }
}

hello('Sam',30) // "Hello, Sam. You are 30." 
hello('Sam')    // "Hello, Sam." 

// 옶션값이 앞에 있는경우
const hello2 = (age: number | undefined, name: string): string => {
 if (age !== undefined) {
  return `Hello, ${name}. You are ${age}.`;
 } else {
  return `Hello, ${name}.`;
 }
}
 
hello2(undefined,'Sam')  // "Hello, Sam."

 

 

4. 나머지 매개변수

const add = (...nums: number[]) => {
 return nums.reduce((acc,cur) => acc + cur, 0)
}

add(1,2,3) // 6

 

 

5. This 

// 1. interface
interface User {
  name: string;
}

// 2. interface로 객체 Sam 생성
const Sam: User = { name:'Sam'}

// 3. 함수 설정 (화살표 함수로 작성하면 오류가 생긴다)
function showName(this:User ,age:number, gender:'m'|'f') {
  console.log(this.name, age, gender)
}

const getSame = showName.bind(Sam) // showName함수가 Sam 객체를 보여주도록 함

getSame(30,'m') // "Sam",  30,  "m"

 

 

6. 매개변수 타입에 따라 결과가 다를 때

// 1. interface
interface User {
  name: string
  age: number
}

// 2. 오버로드를 사용해서 타입에 따른 결과를 다를게 설정
function join(name: string, age: number): User;
function join(name: string, age: string): string;
function join(name: string, age: number | string): User | string {
  if (typeof age === 'number') {
    return {
      name,
      age
    }
  } else {
    return "나이를 숫자로 입력해주세요"
  }
} 

const sam : User = join("Sam", 30)
const jane : string = join("Jane","30")

문제

프로야구팀 울림 제미니스는 오늘도 졌다. 이번에는 스타트링크 걸리버스의 4번타자가 끝내기 홈런을 쳐서 졌다. 울림 제미니스의 열렬한 팬인 지수는 속으로 화를 참으며 어떤 선수 때문에 졌는지 생각해보았다. 지수는 팀이 역전패를 했다면 불펜 투수의 책임이고, 그렇지 않다면 타자와 선발 투수의 책임이라고 생각했다.

지수는 오늘 경기에서 울림이 어떻게 졌는지 생각해보려 했지만, 기분이 너무 더러워서 뭘 할 의욕이 나지 않았다. 지수를 도와 오늘 경기에서 울림 제미니스가 역전패를 했는지 구하는 프로그램을 작성하여라. 역전패가 성립하려면 경기 도중 울림 제미니스가 이기고 있는 순간이 있어야 한다.

 

입출력 예시

 

해결

const fs = require('fs');
const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 2` 
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();

const j = input().split(' ').map(Number)
const s = input().split(' ').map(Number)

let jTeam = 0;
let sTeam = 0;
let flag = false; // 경기에서 승리하다가 지는 것 보여주기

let i = 0
while (i < j.length) {
  jTeam += j[i]
    
  if (jTeam > sTeam) {
    flag = true;
  }
  sTeam += s[i]

  i++
}

jTeam < sTeam && flag == true ? console.log('Yes') : console.log('No')

 

'개발 공부 > Algorithm' 카테고리의 다른 글

[백준/Node.js] 시간과 날짜  (0) 2023.03.25
[백준/Node.js] 주사위 네개  (0) 2023.03.24
[백준/Node.js] 블랙잭  (0) 2023.03.22
[백준/Node.js] 직각 삼각형의 두 변  (0) 2023.03.21
[백준/Node.js] 팬그램  (0) 2023.03.20

문제

카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.

한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.

김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.

이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.

N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.

 

 

입출력 예시

 

해결

const fs = require('fs');
const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `10 500
93 181 245 214 315 36 185 138 216 295` 
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();

const [total, limit] = input().split(' ').map(Number)
const card = input().split(' ').map(Number)

let sum = 0; 

for (let i=0; i<total; i++){
  if (limit < card[i]) continue
  
  for (let j=i+1; j<total; j++){
   if (limit < card[i] + card[j]) continue
    
    for (let z=j+1; z<total; z++){
      if (limit < card[i] + card[j] + card[z]) continue

      if (sum < card[i] + card[j] + card[z]){
        sum = card[i] + card[j] + card[z]
      }
    }
  }
}

console.log(sum)

'개발 공부 > Algorithm' 카테고리의 다른 글

[백준/Node.js] 주사위 네개  (0) 2023.03.24
[백준/Node.js] 오늘도 졌다  (0) 2023.03.23
[백준/Node.js] 직각 삼각형의 두 변  (0) 2023.03.21
[백준/Node.js] 팬그램  (0) 2023.03.20
[백준/Node.js] 탄산 음료  (0) 2023.03.17

1. 인터페이스 및 초기값 설정 

type Score = 'A' | 'B' | 'C' | 'D' | 'F'  


// 1. Interface
interface User {
    name : string;     // 필수
    age : number;      // 필수
    gender? : string;  // 옵션
    readonly birthYear : number;  // 읽기 전용 (수정X)
    [grade : number] : Score;  // 키:number, 값:Score 인 프로퍼티를 여러개 받을 수 있음
}


// 2. Interface 기준으로 초기값 설정
let user : User = {  
    name : 'xx',
    age: 30,
    birthYear : 2000,
    1 : 'A',
    2 : 'B',
}

console.log(user.age) // 30

 

 

2. 인터페이스로 함수 정의

// 1. Interface
interface Add {
  (num1: number, num2: number): number;

}

// 2. Interface를 이용해서 함수 생성
const add : Add = (x,y) => {
  return x + y
}

console.log(add(3,5))  // 8

 

 

3. 인터페이스로 클래스 정의

// 1. Interface
interface Car {
  color: string;
  wheels: number;
  start(): void;
}

// 2. Interface 이용해서 클래스 생성
class Bmw implements Car {
  color;
  wheels = 4;
  constructor(c:string) {  // 생성될때 color를 입력받기
    this.color = c;
  }
  start(){
    console.log('go..')
  }
}

const b = new Bmw('green')
console.log(b) // Bmw: { 'wheels': 4, 'color': 'green'}
b.start() //  "go.."

 

 

3-1. 인터페이스 확장

// 1. Interface
interface Car {
  color: string;
  wheels: number;
  start(): void;
}

// 1-2. Interface 확장
interface Benz extends Car {
  door: number;
  stop(): void;
}

// 1-3. Interface 기준으로 초기값 작성
const benz : Benz = {
  door : 5,
  color : 'black',
  wheels : 4,
  stop(){
    console.log('stop')
  },
  start(){
    console.log('go..')
  }
}

 

 

3-2. 인터페이스 확장

// 1. Car Interface
interface Car {
  color: string;
  wheels: number;
  start(): void;
}

// 2. Toy Interface
interface Toy {
  name: string;
}

// 3. Car와 Toy의 인터페이스 확장
interface ToyCar extends Car, Toy {
  price : number;
}

+ Recent posts