26 Jan 2021 |
Backend
Nestjs 튜토리얼 따라하기 3편
Providers
- Provider는 종속성을 주입하는 기능을 수행함
@Injectable()
데코레이터를 사용
# scr폴더 내에 cats폴더 생성
nest g service cats
위 명령어를 이용하여 프로젝트를 생성하면 다음과 같은 구조를 가진다.
├── src
│ ├── app.controller.ts
│ ├── app.module.ts
│ ├── main.ts
│ └── cats
│ └── cats.service.ts
cats.service.ts에 다음과 같은 코드를 입력한다.
// cats.service.ts
import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';
@Injectable()
export class CatsService {
private readonly cats: Cat[] = [];
create(cat: Cat) {
this.cats.push(cat);
}
findAll(): Cat[] {
return this.cats;
}
}
이를 사용하기 위해서 CatsController에 연결해준다.
// cats.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';
@Controller('cats')
export class CatsController {
constructor(private catsService: CatsService) {}
@Post()
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
@Get()
async findAll(): Promise<Cat[]> {
return this.catsService.findAll();
}
}
생성자를 통하여 catsService를 선언하고 catsService에 선언된 함수를 사용하였다.
CatsService, CatsController를 정의하였으므로 이를 수행할 수 있도록 module에 등록하여야 한다.
// app.module.ts
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
import { CatsService } from './cats/cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class AppModule {}
17 Jan 2021 |
PS
AtCoder Beginner Contest 188 B번 ABC Tournament
문제
https://atcoder.jp/contests/abc188/tasks/abc188_c
풀이
길이가 2^N인 수열 N이 있고 수열 N은 i번째 플레이어의 레이팅을 나타낸다고 했을 때
모든 플레이어가 토너먼트식으로 진행을 할 때 2등을 하는 플레이어는 누군지 선택하는 문제
토너먼트로 진행이 되므로 결승전은 수열 N을 반으로 나누어 만든 두 그룹 중, 앞 그룹 중 1등 vs 뒷 그룹 중 1등의 결승 대진이 확정된다.
결승전에서 진 플레이어가 2등이므로 해당 플레이어의 인덱스를 출력하면 정답
코드
#pragma warning(disable : 4996)
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<ll> vll;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pld;
typedef tuple<ll, ll, ll> tl3;
#define FOR(a, b, c) for (int(a) = (b); (a) < (c); ++(a))
#define FORN(a, b, c) for (int(a) = (b); (a) <= (c); ++(a))
#define rep(i, n) FOR(i, 0, n)
#define repn(i, n) FORN(i, 1, n)
#define tc(t) while (t--)
// https://atcoder.jp/contests/abc188/tasks/abc188_c
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n;
cin >> n;
vll a(pow(2,n));
for(int i = 0;i<pow(2,n);i++){
cin >> a[i];
}
ll max1 = 0, max2 = 0;
ll idx1 = 0, idx2 = 0;
for(int i = 0;i<a.size()/2;i++){
if(max1 < a[i]){
max1 = a[i];
idx1 = i+1;
}
}
for(int i = a.size()/2;i<a.size();i++){
if(max2 < a[i]){
max2 = a[i];
idx2 = i+1;
}
}
if(max1 > max2) cout << idx2;
else cout << idx1;
return 0;
}
17 Jan 2021 |
PS
AtCoder Beginner Contest 188 B번 Orthogonality
문제
https://atcoder.jp/contests/abc188/tasks/abc188_b
풀이
길이가 n인 수열 A와 B가 있을때 의 합이 0이면 Yes 아니면 No를 출력
코드
#pragma warning(disable : 4996)
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<ll> vll;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pld;
typedef tuple<ll, ll, ll> tl3;
#define FOR(a, b, c) for (int(a) = (b); (a) < (c); ++(a))
#define FORN(a, b, c) for (int(a) = (b); (a) <= (c); ++(a))
#define rep(i, n) FOR(i, 0, n)
#define repn(i, n) FORN(i, 1, n)
#define tc(t) while (t--)
// https://atcoder.jp/contests/abc188/tasks/abc188_b
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n;
cin >> n;
vll a(n), b(n);
ll res = 0;
rep(i,n){
cin >> a[i];
}
rep(i,n){
cin >> b[i];
}
rep(i,n){
res += (a[i] * b[i]);
}
if(res == 0){
cout << "Yes";
}
else cout << "No";
return 0;
}
17 Jan 2021 |
PS
AtCoder Beginner Contest 188 A번 Three-Point Shot
문제
https://atcoder.jp/contests/abc188/tasks/abc188_a
풀이
농구를 하는데 현재 스코어가 X-Y 라고 한다면, 3점슛 한번으로 역전을 할 수 있는지 없는지 판별하는 문제
두 점수의 차가 2 이하가 되면 Yes, 그렇지 않으면 No를 출력한다.
코드
#pragma warning(disable : 4996)
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<ll> vll;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pld;
typedef tuple<ll, ll, ll> tl3;
#define FOR(a, b, c) for (int(a) = (b); (a) < (c); ++(a))
#define FORN(a, b, c) for (int(a) = (b); (a) <= (c); ++(a))
#define rep(i, n) FOR(i, 0, n)
#define repn(i, n) FORN(i, 1, n)
#define tc(t) while (t--)
// https://atcoder.jp/contests/abc188/tasks/abc188_a
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll x,y;
cin >> x >> y;
if(abs(x-y) <= 2) cout << "Yes";
else cout << "No";
return 0;
}
14 Jan 2021 |
PS
AtCoder Beginner Contest 187 D번 Choose Me
문제
https://atcoder.jp/contests/abc187/tasks/abc187_d
풀이
타카하시가 투표에서 이기려면 연설을 최소 몇번해야하는지 묻는 문제
x를 타카하시 투표수 - 아오키 투표수 라고 한다면
x는 i번 마을을 방문할 때 마다 2Ai+Bi 씩 증가함
x > 0 이 성립된다면 그때부터는 타카하시가 더 많은 득표를 할 수 있게 된다.
코드
#pragma warning(disable : 4996)
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<ll> vll;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pld;
typedef tuple<ll, ll, ll> tl3;
#define FOR(a, b, c) for (int(a) = (b); (a) < (c); ++(a))
#define FORN(a, b, c) for (int(a) = (b); (a) <= (c); ++(a))
#define rep(i, n) FOR(i, 0, n)
#define repn(i, n) FORN(i, 1, n)
#define tc(t) while (t--)
// https://atcoder.jp/contests/abc187/tasks/abc187_d
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n;
cin >> n;
vll x(n);
ll temp = 0;
ll ans = 0;
rep(i,n){
ll a,b;
cin >> a >> b;
temp -= a;
x[i] = a+a+b;
}
sort(all(x));
while(temp <= 0){
temp += x.back();
x.pop_back();
ans++;
}
cout << ans;
return 0;
}