반응형
반응형

[백준] 8958. OX퀴즈

Algorithm|2021. 11. 15. 15:36
반응형
 

8958번: OX퀴즈

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수

www.acmicpc.net

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int score(string q);

int main(void)
{

  int n;
  vector<int> s;

  string quiz;
  cin >> n;
  for(int i=0;i<n;i++)
  {
    cin >> quiz;
    s.push_back(score(quiz));
  }

  for(int i=0;i<n;i++)
    cout << s[i]<<'\n';

  return 0;
}


int score(string q)
{
  int acc_score = 0;
  int fin_score = 0;

  for(int i=0;i<q.size();i++)
  {
  
  acc_score++;
    
    if(q[i] == 'O')
      fin_score += acc_score;
    else 
        acc_score = 0;
        
  }
  return fin_score;
}
반응형

'Algorithm' 카테고리의 다른 글

[백준] 1159. 농구경기  (0) 2021.11.15
[백준] 5822. 다이얼  (0) 2021.11.15
[Leetcode] 1029. Two City Scheduling  (0) 2021.11.12
[백준] 2799. 블라인드  (0) 2021.11.09
[백준] 4344. 평균은 넘겠지  (0) 2021.11.09

댓글()

[Leetcode] 1029. Two City Scheduling

Algorithm|2021. 11. 12. 16:21
반응형

 

 

Two City Scheduling - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

다해봐도 모르겠어서 가능한 모든 경우의 수를 찾아서 최소값을 구하는 방법을 생각해봤는데

이는 O(n⁴) 까지 고려해야 한다.

 

Main Idea를 찾아본 결과

a와 b의 차이가 가장 큰 경우 작은 값을 이용하면 됐다.

은근 단순해서 화났음

/*
1. costs의 a와 b의 차이와 index를 2차원 배열에 저장
2. gap 값을 기준으로 오름차순 정렬
3. costs size까지 반복하며 순서대로 a,b costs size 절반을 넘지 않도록 더함 
*/


class Solution {
public:
    int twoCitySchedCost(vector<vector<int>>& costs) 
    {
        vector<vector<int>> gap_index;
        int a = 0;
        int b = 0;
        int ans = 0;
        for(int i=0; i<costs.size(); i++) //1과정
        {
            vector<int> v;
            v.push_back(abs(costs[i][0] - costs[i][1]));
            v.push_back(i);
            
            gap_index.push_back(v);           
        }
        
        sort(gap_index.begin(), gap_index.end(), greater<>()); //2과정
        
        
        for(int i=0; i<costs.size(); i++) //3과정
        {
            int idx = gap_index[i][1];
            
            if((costs[idx][0] < costs[idx][1] && a<costs.size()/2) || b>= costs.size()/2) 
            {
                ans += costs[idx][0];
                a++;
            }
            else if((costs[idx][0] >= costs[idx][1] && b<costs.size()/2) || a>= costs.size()/2) 
            {
                ans += costs[idx][1];
                b++;                
            } 
        }    
        
        return ans;
    }
};

실수..

a, b 차이를 내림차순으로 indexing 해야되는데 오름차순해버림 ㅋㅋ;

 

 

 

 

반응형

'Algorithm' 카테고리의 다른 글

[백준] 5822. 다이얼  (0) 2021.11.15
[백준] 8958. OX퀴즈  (0) 2021.11.15
[백준] 2799. 블라인드  (0) 2021.11.09
[백준] 4344. 평균은 넘겠지  (0) 2021.11.09
[Programmers] 스킬트리  (0) 2021.11.07

댓글()

[백준] 2799. 블라인드

Algorithm|2021. 11. 9. 21:13
반응형
 

2799번: 블라인드

첫째 줄에 M과 N이 공백으로 구분해서 주어진다. (1 ≤ M, N ≤ 100) 다음 줄에는 현재 건너편 아파트의 상태가 주어진다. 모든 창문은 문제 설명에 나온 것 처럼 4*4 그리드로 주어진다. 또, 창문과

www.acmicpc.net

 

 

window의 행, 열 축을 반대로 생각해서 고생 좀 함,,,,

창문 타입을 판단하는 부분도 **** 이면, 그냥 else 처리하면 되는데,

else if(w[5*i+5][5*j+1] == '.') 로 생각 없이 적었음 ㅋㅋ

 

#include <iostream>
#include <bits/stdc++.h>
#include <vector>
using namespace std;


int main(void)
{
    int m,n;
    int t;
    vector<int> ans(5);
    
    char w[501][501];
    
    
    cin >> m >> n;
    
    for(int i=0; i<5*m+1;i++) //블라인드 입력
        for(int j=0; j<5*n+1;j++)
            cin >> w[i][j];
    
    for(int i=0; i< m; i++)
    {
        for(int j=0; j< n; j++)
        {
            if(w[5*i+1][5*j+1] == '.')
              {ans[0]++; }  
            else if(w[5*i+2][5*j+1] == '.') 
              {ans[1]++; }
            else if(w[5*i+3][5*j+1] == '.') 
              {ans[2]++; }
            else if(w[5*i+4][5*j+1] == '.') 
              {ans[3]++; }
            else 
              {ans[4]++;}

        }
    }

    for(int i = 0; i<5; i++)
        cout << ans[i] <<" ";
    
    return 0;
}​
반응형

'Algorithm' 카테고리의 다른 글

[백준] 8958. OX퀴즈  (0) 2021.11.15
[Leetcode] 1029. Two City Scheduling  (0) 2021.11.12
[백준] 4344. 평균은 넘겠지  (0) 2021.11.09
[Programmers] 스킬트리  (0) 2021.11.07
[백준] 2920 . 음계  (0) 2021.11.07

댓글()

[백준] 4344. 평균은 넘겠지

Algorithm|2021. 11. 9. 15:54
반응형

 

 

4344번: 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

www.acmicpc.net

왜 계속 틀렸나 했는데 마지막에 출력 부분에 '%'를 안 붙임 ㅋㅋ..

#include <iostream>
#include <vector>
#include <numeric>
#include <math.h>
#include <algorithm>

using namespace std;


int main(void)
{
    int c = 0; // case 수
    int s_num; // case 별 학생 수
    double rate = 0;
    int count = 0;
    
    cin >> c ;
    vector<vector<int>> score; //case 별 학생들 점수 vector
    vector<int> v; // score 2차원 확장
    
    
    for(int i=0; i<c; i++) //score 값 저장
    {
        cin >> s_num; 
        score.push_back(v);
        for(int k=0; k<s_num; k++)
        {
            int num=0;
            cin >> num;
            score[i].push_back(num);
    
        }
        
        double sum = std::accumulate(score[i].begin(), score[i].end() , 0.0);
        double mean = sum / score[i].size();
        
        for(int k=0; k<score[i].size(); k++)
        {
            if(mean < score[i][k])
                count +=1;
        } 
        
        rate = 100.0 * count / score[i].size();
        cout.setf(ios::fixed);
        cout.precision(3);
        cout << rate <<'%' <<'\n';
        count = 0;
    }
    

    return 0;
}
반응형

'Algorithm' 카테고리의 다른 글

[Leetcode] 1029. Two City Scheduling  (0) 2021.11.12
[백준] 2799. 블라인드  (0) 2021.11.09
[Programmers] 스킬트리  (0) 2021.11.07
[백준] 2920 . 음계  (0) 2021.11.07
[Leetcode] 455. Assign Cookies  (0) 2021.11.07

댓글()

[Programmers] 스킬트리

Algorithm|2021. 11. 7. 15:15
반응형

조건을 너무 복잡하게 생각했었다.

다시 종이에 그리면서 해보니깐 단순했다.

머쓱 ^^

 

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int solution(string skill, vector<string> skill_trees) 
{
    int answer = 0;
    int flag = 0;

    vector<int> map(26); 
    fill(map.begin(), map.end(), -1);

    for(int i=0; i<skill_trees.size();i++)
    {
        for(int k=0; k<skill.size(); k++) 
        {    
            map[skill[k] - 65] = 21 + k; 
        }//skill_tree의 default 값을 True로 설정
        //21부터 설정한 이유는 skill_trees.size()가 최대 20이기 때문
        
        for(int k=0; k<skill_trees[i].size(); k++) 
        {   
            map[skill_trees[i][k] - 65] = k;
        } //skill_trees별 map 제작


        for(int k=1; k<skill.size(); k++) 
        {    
            if( map[skill[k-1] - 65] >= map[skill[k] - 65] )
                flag = 1;
        } //map내 skill 순서의 index가 오름차순이 아닐 경우 오답 flag

        if(flag == 0)
            answer++;

        flag = 0; //다음 스킬트리를 확인하고자 초기화
        fill(map.begin(), map.end(), -1);

    }

    return answer;
}
반응형

'Algorithm' 카테고리의 다른 글

[백준] 2799. 블라인드  (0) 2021.11.09
[백준] 4344. 평균은 넘겠지  (0) 2021.11.09
[백준] 2920 . 음계  (0) 2021.11.07
[Leetcode] 455. Assign Cookies  (0) 2021.11.07
[Leetcode] 211. Design Add and Search Words Data Structure  (0) 2021.09.28

댓글()

[백준] 2920 . 음계

Algorithm|2021. 11. 7. 14:09
반응형
 

2920번: 음계

다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascending, 8

www.acmicpc.net

 

Boyer-Moore 알고리즘의 아이디어를 따와 풀었다.

 

[Leetcode] 169. Majority Element

Identifying the Problem 최빈값을 찾아라 단 최빈값은 배열 길이 절반 이상 있다. Input: nums = [3,2,3] Output: 3 Input: nums = [2,2,1,1,1,2,2] Output: 2 Organizing thoughts 바로 떠오르는 알고리즘이 ..

gold-goose.tistory.com

ascending이면 7번 연속으로 오른 것이므로 count가 7이고,

descending 이면 7번 연속으로 내린 것이므로 count가 -7이고,

mixed이면 -6~6 사이 값이 나온다.

#include <stdio.h>
#include <iostream>

using namespace std;

int main(void)
{
    int a[8]; #음계 배열
    int count = 0;
    for(int i=0; i<8; i++) #음계 입력
        cin >> a[i];
    
    for(int i=1; i<8; i++)
    {
        if(a[i-1] < a[i])
            count++;
        else
            count--;
    }
    if(count == 7)
        cout << "ascending";
    else if(count == -7)
        cout << "descending";
    else
        cout << "mixed";
       
    return 0;
}
반응형

댓글()

[Leetcode] 455. Assign Cookies

Algorithm|2021. 11. 7. 13:44
반응형

Identifying the Problem

보유한 쿠키로 만족시킬 수 있는 최대한의 아이들의 수를 구한다.

g[ ] : 아이들 별로 만족하는 쿠키 사이즈

s[ ] : 보유한 사이즈별 쿠키

Organizing thoughts

1)  s[j] >= g[i] 꼴을 만족하면 아이에게 쿠키를 줄 수 있다.

2)  아이가 만족하는 쿠키와 주어진 쿠키 사이즈가 최대한 똑같아야 한다.

3) s의 길이가 길든, g의 길이가 길든 탐색은 s 길이만큼 진행해야 한다.

4)  단, s가 더 길 때, 모든 아이들에게 쿠키를 나누어 준 경우, 탐색을 중단한다. 

Sourcecode

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) 
    {
        int k = 0;
        
        sort(g.begin(), g.end()); // g,s를 오름차순 정렬
        sort(s.begin(), s.end());
        
        for(int i = 0; i<s.size(); i++)
        {
            if(g[k] <= s[i])
                k++;
            if(k == g.size()) break;

        }
        return k;
    }
};
반응형

댓글()

[금융상품] 채권

Quant|2021. 10. 26. 21:15
반응형

아래 영상을 참고하여 작성하였음

 

 

채권 종류

무이자 할인채(Zero Coupon Bond) :  이자없이 발행 시 할인해서 발행

이자 지급 채권 : 액면가에 판매해 이자를 주고 만기 때 액면가를 돌려줌

 

채권 특징

회사 부도/파산일 경우 원금 손실이 가능하지만 주식보다 상환이 우선순위이다.

 

국채(이머징 채권), 회사채(우량채, 하이일드 채권)

BBB 이상 : 투자적격 우량채, 경기 하락시에 Outperform

BB 이하 : 투자부적격 하이리드 채권 - 주식과 아주 비슷한 모습을 보임.

경기 상승기에 Outperform

 

신용 등급별 이자율 표

 

한국신용평가

의견등록 입력이 완료되었습니다 담당자 확인 후 회신드리겠습니다 감사합니다

www.kisrating.co.kr

만기가 길수록, 신용 등급이 낮을 수록 이자율이 높음을 알 수 있다.

 

경제 상황이 나빠지면 리스크 프리미엄이 올라가 낮은 등급일수록 채권 이자율이 상승함

 

이자율 결정 요인

1) 신용도 - 신용이 높을수록 적므리 대출 가능

2) 만기 - 만기가 길 수록 리스크 노출 증가
   Duration은 채권 가격이 이자율 변화에 얼마나 민감한지 이야기해주는 척도이다.

3) 경제 상황 - 경기가 안 좋고 회사 위험이 높아질수록 이자가 높아짐

 

금리 상승과 채권 가격의 결정

 

만약 액면가 100$, 4%이자(매년 4$) 채권이 있다고 할 때,

금리가 1%상승 하면, 새로 발행된 액면가 100$ 5% 채권을 사지 이전의 채권은 아무도 안 삼

만약 이전의 채권을 80$에 판다면, 매년 4$를 받으니 이자 5%가 되고, 최근에 발행된 채권과 비슷한 매력도를 가짐

하지만, 채권의 가격은 금리 1% 상승에 20%정도 하락을 하게 됨

 

위의 계산은 만기시 돌려받는 금액을 생각하지 않았기에 잘못된 계산임

새로 발행된 채권은 만기 시 100+5$의 결과이고

기존 발행된 채권은 만기 시 100+4$의 결과이므로,

비슷한 매력도를 가지게 하려면 100+4-5$인 99$로 채권 가격을 파는 것이 맞다.

 

80$에 이걸 샀다면, 만기에 100 + 4$를 받고 104-80 이므로 1년만 놓고보면, 매수자는 24$ 30% 이득을 본다.

 

가산금리

개별 채권 금리 = 국채금리 + 가산금리 Spread

가산금리는 시장 위험 척도, 즉 RiskPremium이다.

시장의 위험을 미리 감지할 수가 있고, 시중금리라 반대로 움직이는 성격을 가진다.

 

리보금리

리보금리는 은행간 빌려주는 금리

TED Spread는 금융시스템과 은행의 건전성과 관련있다.

 

CDS

CDS는 기초자산에 대한 신용 리스크를 헷지하기 위한 보험이다.

[매수 포지션] 기초 자산에 대한 보험을 삼 -> 이에 따른 프리미엄을 지불

[매도 포지션] 기초 자산에 대한 보험을 팖 -> 기초 자산 파산 시 큰 금액을 보상

 

투자 타이밍

금리하락이 기대될 때는 장기채에 투자한다.

금리 하락시 채권가격 상승에 대한 이익을 극대화 함

Duration이 크니 채권 가격상승의 정도가 더 커진다.

물론 이상황에서 닫ㄴ기채를 사도 이득이지만 장기채의 이득이 더 크다.

 

금리상승이 기대 될 때는 단기채에 투자한다.

금리 상승 시 듀레이션이 짧은 채권에 투자함으로써 손실을 최소화

위와 같은 이유로 채권 가격이 하락하니 하락폭이 적은 단기채에 투자한다.

 

 

 

더 알아보고 싶은 부분은 Duration이 어느정도의 레버리지 효과를 가지고 있는지 궁금하다.

반응형

'Quant' 카테고리의 다른 글

[Project] 증권사 리포트에 따라 사면 어떻게 될까??  (35) 2022.03.11
[Quant Strategy] Pair Trading with Long/Short  (17) 2022.02.20
Project : Price and EPS NTM  (1) 2021.12.09
[금융상품] 원유  (20) 2021.10.18
[금융 상품] 금 / 은  (191) 2021.10.13

댓글()

[금융상품] 원유

Quant|2021. 10. 18. 15:33
반응형

 

 

원유 매매의 특징

1. 거시경제와 지정학적 상황에 따른 장기추세 파악이 용이
2. 기술적 분석이 잘 먹힘
3. 주요 플레이어들에 의해 가격 경계가 형성

 

원유 매매의 요소

5가지 요소로 볼 수 있다.

 

I. 국제 정세와 각 주요 플레이어들의 의도와 동향

 

  • OPEC
    OPEC의 영향력이 약해지는 5가지 이유.

    1) 사우디에 대한 신뢰성 하락
    2) 카타르의 탈퇴
    3) 러시아의 강해지는 영향력
    4) 미국 셰일 업계의 지속적인 견제
    5) 미국의 NOPEC Bill - OPEC 반독점 법안

  • 사우디
    매장량 부풀림, 생산여력 부정확, GDP 신뢰성 하락
    미국 셰일 업계 공격으로 원유 가격을 내렸지만 오히려 사우디가 당함

    크게 위 두가지 이유로 OPEC의 수장 격의 국가지만 위상이 낮아지고 있음

  • 미국
    미국 셰일업계는 사우디의 공격을 버티면서 저유가에 경쟁력을 가지게 되었다.
    -> "미국과 사우디의 관계가 점점 악화된다"는 말은
         "미국이 페트로 달러 시스템을 장기적으로 버려갈 수도 있다"는 힌트가 될 수 있다.

    OPEC과 러시아는 원유가격원유 가격 상승을, 미국은 원유 가격 하락을 원함

    이상적인 원유가격은 다른 산유국들이 생산량을 절제해야 할 정도로 낮으면서도
    본인들의 생산 원가보다는 높은 레벨이다.
    원유 가격이 너무 높으면, 모두가 생산을 늘려 미국은 점유율 하락으로 이어지고 손해가 발생한다.

  • 이란
    지정학적으로 매우 중요한 위치
    트럼프 정부의 핵 파기에 따라 미국과의 관계 악화 및 중국 러시아와 친교

  • 러시아
    미국과 이란의 관계 악화에 따른 큰 수혜자
    매장량은 적지만, 파이프라인의 지정학적인 영향이 큼
    유럽 원유 수입의 1/3을 러시아로부터 충당

  • 이라크
    미개발지가 많아, 공식 통계가 과소평가되었다는 이야기가 있다.

  • 중국
    2000년대 원자재 슈퍼사이클을 창조한 최대 원유 수입국

II. 경기 사이클

    코로나 폭락으로 마이너스 유가 후 점차 회복되는 모습

    원유 수요가 폭발하는데 이에 맞춘 공급은 몇 년 이상 걸리며 장기적인 추세가 생기는 현상

 

III. 원유가격의 상단과 하단을 파악

     
    1) 미국의 불편한 가격 - 뉴스를 보면 미국 정치권에서 알아서 나온다.

    2) OPEC과 러시아가 감산 중일 경우, 감산을 끝내는 타이밍
    3) Breakeven price는 Fiscal Breakeven(정부 예산의 손익분기)과 External Breakeven(경상 수지의 손익분기)로

       나눌 수 있고, 매매에서는 External을 보는 게 맞다. (정부에 대한 신뢰도가 저마다 달라 그런 듯)

       

       경상수지란 통상 영업 활동의 과정에서 생기는 수입과 지출의 차액을 말한다.

       따라서 유가가 External들의 분포보다 낮게 형성되어 있을 때, 매수하는 전략도 잘 통한다.

 

아래 사이트에서 국가별 자세한 원유 정보를 볼 수 있다.

 

Cost of Oil Production by Country - knoema.com

(Oct 2018) Global oil prices have fallen by more than 30 percent since the summer of 2014, affecting oil producers and consumers alike. This dashboard presents oil price dynamics and the breakeven oil prices—minimum oil price to cover general governmen

knoema.com

 

IV. 기술적 분석

     차트 분석

 

V. 상품 선정 및 진입
   

    상품은 선물, ETF, 옵션 등 다양함

    진입 타이밍은 위의 네 가지가 같은 방향을 가리킬 때가 적절하다.    

 

참고로 에너지 상품은 스프레드 전략들이 많다.

예로, 월 물간 스프레드, 상품 간 스프레드, 분리 스프레드, 크랙 스프레드가 있다.

반응형

'Quant' 카테고리의 다른 글

[Project] 증권사 리포트에 따라 사면 어떻게 될까??  (35) 2022.03.11
[Quant Strategy] Pair Trading with Long/Short  (17) 2022.02.20
Project : Price and EPS NTM  (1) 2021.12.09
[금융상품] 채권  (18) 2021.10.26
[금융 상품] 금 / 은  (191) 2021.10.13

댓글()

[금융 상품] 금 / 은

Quant|2021. 10. 13. 18:08
반응형

아래 영상을 참고해 작성했습니다.

 

 

“미국이 기축통화 지위를 버릴 것이다.”라는 의견을 처음 듣는다면


1. 얼토당토하지 않은 이야기라 무시되어 온 건지
2. 이 이야기가 초창기라서 그런 건지
3. 주류 의견 중 하나였던 건데 나만 몰랐던 건지
확인해야 한다.

금의 가격에 영향을 미치는 요소

  • 달러 인덱스
 

미국 달러 지수 - Investing.com

일부 외국 통화들에대한 미국 달러의 가치를 측정하는 미 달러 지수 (USDX)

kr.investing.com

금이 달러로 표기되기 때문에, 달러 가치 하락 시 달러로 표기된 금 가격이 상승한다.

  • 실질 채권 수익률 = 명목 채권 수익률 - 인플레이션
 

미국 10년물 국채 금리 - Investing.com

미국 국채 금리에 대한 현재와 과거 데이터 등 상세한 정보를 확인하세요.

kr.investing.com

 

 

United States Inflation Rate | 2021 Data | 2022 Forecast | 1914-2020 Historical

US CPI figures likely showed inflationary pressures on the economy remain elevated in September as supply-chain bottlenecks have not improved and energy prices soared, raising further concerns that high inflation will last longer than expected. Consumer pr

tradingeconomics.com

인플레가 커질수록 금값이 상승하므로 실질 채권 수익률과 음의 상관관계
추가 부양책 > 재정적자로 인한 국채 공급 > 국채 가격 하락> 채권 수익률 상승 > 금 폭락

  • 시장 참여자들의 센티먼트

공포지수 선물 시장 포지셔닝, 뉴스 / 미디어 감성지수를 머신러닝으로 파악

 

여기까지가 가장 중요한 요소들이다.

 

  • 연준의 대차대조표 / m2 통화량

     08년도 이전에는 금융기관들의 초과준비금이 없어 금융위기에 대비할 수 없었고,
     양적완화가 이루어져도 이 돈이 금융기관으로 흘러갔다.
      -> 금융위기 터지며 금이 급등하다, 금융위기 이후 급락

      이번 코로나 사태는 금융기관은 건전한 상태에서 발생해 유동성 장세가 지속되고 있다.
      -> 코로나 이후 급락할 확률은 낮을 듯하다.

 

 

  • 주식 시장 / 변동성 지수
    금을 안전자산 취급하므로, 변동성 지수와 비례 핵도 하다

 

  • 귀금속 수요, 산업 수요, 소비 수요 : 투자 수요와 반비례
    금이 비싸질수록 투자 수요는 크지만 소비수요는 줄어듦

        

  • 금 공급
    광산 채굴 / 재활용 / 정부 > 금 채굴은 가격의 변화에 비 탄력적 > 수요 주도 시장



은 가격 결정 요인

 


1. 금의 가격 결정 요인
2. 정책 변화에 금보다 민감
3. 제조업 경기 : 미국 제조업 생산, ISM 제조업 PMI

금 : 장기적인 자산 가치 보존에 적합
은 : 추가적으로 정책에 대한 뷰, 산업 사이클

Gold / Silver Ratio
20 ~ 100 왔다 갔다 하며, 높으면 금 숏, 은 롱 낮으면 금 롱 은 숏 하기도 함

 

골드 실버 비율

GOLDPRICE.ORG - The No. 1 current gold price site for fast loading live gold price charts in ounces, grams and kilos in 30 major currencies plus advice on how to buy gold.

goldprice.org

금속 투자 방법

레버리지 ETF 같은 경우 , 금 선물을 포함하고 롤오버 비용이 꾸준히 발생한다.
또한 선물은 만기가 멀 수록 비쌈 = 지금 받을 걸 더 나중에 받는 거니 보관 비용이 발생
따라서 금 현물을 보유한 etf를 사는 걸 추천

산업금속이 주식과 비교해 가지는 이점
1. 파산, 상장폐지 가능성이 제로
2. 생산 가격이라는 가격의 바닥이 존재
3. 제대로 공부 시 , 경기 사이클과 산업 사이클과 재정정책 사이클에 따라 투자 가능
4. 금융경제 위기에 가치가 보존

 

 

 

반응형

'Quant' 카테고리의 다른 글

[Project] 증권사 리포트에 따라 사면 어떻게 될까??  (35) 2022.03.11
[Quant Strategy] Pair Trading with Long/Short  (17) 2022.02.20
Project : Price and EPS NTM  (1) 2021.12.09
[금융상품] 채권  (18) 2021.10.26
[금융상품] 원유  (20) 2021.10.18

댓글()

[독서]《1년 안에 AI 빅데이터 전문가가 되는 법》정리

todo|2021. 10. 10. 15:35
반응형

Part 3 기초

AI 빅데이터 활용에 관한 경영학 서적을 읽어라

저자 추천 도서 목록

<빅데이터 기초 : 개념 동인 기법> <인공지능 시대의 비지니스 전략>

<빅데이터가 만드는 4차산업 혁명> <빅데이터 비지니스 이해와 활용> <빅데이터 분석과 활용>

데이터 마이닝 분석 방법론에 대한 기본원리 및 활용사례를 공부하라

다음을 중점적으로 공부하자


1. 데이터에 대한 이해

2. 데이터 전처리 기술
3. 데이터 분석방법과 그에 다른 알고리즘

저자 추천 도서 목록


<데이터 마이닝 개념과 기법>(에이콘 출판)
심화 - <패턴인식> <데이터 마이닝 기법과 응용>

각 분석 방법론과 알고리즘을 사용하는 사례를 찾기 → 논문(RISS) or 저널
국내 : <지능정보연구> <한국경영과학회지><Information Systems Review>
해외 : <IEE Access> <IEEE Transactions on Big Data> <Information Systems Research>

카테고리는 컴공, 수학, 통계, 산업공학 보다는 정보시스템학 계열을 선택

 

실질적으로 도움이 되는 최소한의 자격증


한 번에 몰아서 딸 것  준전문가, 2급정도만 할 것

데이터 분석 자격검정 & 경영빅데이터 분석사 동시준비
사회조사분석사 (필기 - 조사방법론 1 필요없고, 2가 중요하다)
SQL 자격검정 - (데이터 모델링, SQL쿼리 중점) <SQL 전문가 가이드> (한국데이터베이스진흥원)

수학

책에선 개론책을 추천했는데, 나는 아래의 두 책을 읽을 것이다.


<프로그래머를 위한 선형대수학> <데이터 과학을 위한 통계: 데이터 분석에서 머신러닝까지 50가지 핵심 개념>

 

기본적인 딥러닝에 관한 서적을 읽어라


1. 으로 딥러닝 공부하기 <딥러닝 제대로 시작하기>(제이펍)
2. 강의로 딥러닝 공부하기 <김성훈 교수 - 딥러닝 강좌>
3. 좀 더 깊게 공부하기 <밑바닥부터 시작하는 딥러닝>
4. 이후 CNN LSTM 오토인코더 GAN 등 다양한 딥러닝 모델 공부, 실제 코드도 구현
4-1 딥러닝 구현 라이브러리 (텐서플로우 케라스 카페 파이토치 티아노 중 택 1) 
<케라스 창시자에게 배우는 딥러닝> 강추

밑바닥부터 시작하는 딥러닝 시리즈 → 핸즈온 머신러닝 2판 → 오랠리 시계열  분석

이렇게 진행할 계획이다.

 

데이터베이스에 대한 기본적인 이론을 익혀라

RDB - <Database Concepts>(Pearson Education) //은근 쉽다
No-SQL - 몽고DB <몽고디비 인액션> // 7 ~ 10 장은 pass

월가아재 추천 <SQL in 10 Minutes Sams Teach Yourself> 을 읽으려 했으나,

 

SQL 자격검정 시험을 보면서 찍먹 후 쉬운 책으로 공부할 계획이다.

Part 4 자신만의 전문분야를 선정하라

 

캐글 경연대회를 통해 경험을 쌓으라

최대한 다양한 분야의 연구를 해보라

캐글 필사 → 라이브 대회 참여, 디스커션 공부 → 라이브러리, 논문 → PPT 정리

 

 

자신만의 연구 분야를 선정하라

[기술] 이미지분석 딥러닝 금융공학 이상탐지 추천알고리즘 텍스트 마이닝

[현상] 정치 금융 생명 등등

 

기술 파트에는 시계열 데이터, 회귀분석 현상은 금융공학에 관심이 많다.

 

전문분야에 대한 서적을 읽어라

아마존 닷컴에서 기술이나 현상 분야의 심도있는 책들을 찾을 수 있따.
*상세한 설명이 있는 꽤 두꺼운 책을 읽어라
*교수가 쓴 책보다 현업 개발자가 쓴 책을 사라

 

전문 분야에 대한 논문을 읽어라

최신 트랜드는 논문이 책보다 훨씬 빠르다
*기억에 남기는 논문읽기 *자신만의 정리 방법을 반드시 가질 것

1. 논문 맨 앞 표지에 해당 논문의 가장 핵심적인 아이디어를 간단히 요약
2. 괜찮다 싶은 아이디어는 나만의 아이디어 노트에 따로 정리
3. 인용이 많이 되었거나 해당 연구 분야에서 핵심적인 아이디어를 제안했던 논문들은 따로 워드테이블로 정리 (저자, 제목, 연도, 연구목적, 연구 방법)
검색 시 노무 많은 논문이 나와 뭐부터 읽어야 할지 모르겠다면
1. 인용수가 많은 논문
2. 최신 경향을 익히기 위해 가장 최근인 논문
3. 선행 연구 부분이 자세하게 나와 있는 논문순으로 읽는다

 

주 프로그래밍 언어를 선정하고 관련 프로젝트를 반복 훈련해라


[실전 프로젝트 경험을 쌓는 방법]
1. 회사 취업
2. 플리랜서로 활동 - 대학생 숙제, 재능플랫폼에서 활동
3. 자체 프로젝트 수행 - sns 웹 크롤링

자신만의 독창적인 알고리즘을 만들어 보라

기존의 아이디어에 자신의 아이디어를 얹어라
-메타분석을 한 기존 논문을 읽어라 * 기존 문헌들을 분석후 연구 트렌드와 연구가 부족한 부분을 연구하는 방법이다.
-구글 학술검색에서 검색 시 Literatrue Review 라는 키워드를 함께 넣어 주자
-하나의 알고리즘 보다는 두 개 이상의 알고리즘을 써라

 

한국 학술지 인용색인 등재지에 도전하라

1. 논문 투고 타깃 저널을 정하라
   i. 자신이 자주 읽어보았던 논문들이 주로 어떠한 저널에 실려있었는지 확인

   ii. 저널마다 각기 선호하는 논문의 성격이나 주제가 있을 수 있다 == 내 논문도 이 저널에 실리기 유리하다


2. 바로 논문 작성을 해보라

    i. 논문 작성 전 벤치마킹할 논문을 정한다.  (표절하라는 뜻이 아니다.)

 

 

크게 분류 해보면

경영학 도서 / 코딩 / 데이터 마이닝

SQL / 수학 / 딥러닝 / 자격증 

관심 분야 /프로젝트 / 논문이고

 

자격증, 프로젝트, 논문 같은 경우 당장 시작하기에 부담이 있기에

추천도서, 코딩, 수학, 딥러닝, 관심 분야(금융공학) 정도는 1년동안 부담없이 공부할 수 있을 것 같다.

반응형

댓글()

Project : QQQ Price Predict

Machine Learning|2021. 10. 5. 19:50
반응형

다중 선형 회귀를 사용해 QQQ의 가격을 예측해보도록 하겠다.

Feature Data는 RSI, BTC, 10년 채권 수익률, 거래량, Vix 지수를 사용하였고, 데이터는 인베스팅 닷컴에서 구했다.

 

아래의 데이터를 정제 후 사용하였다.

data.csv
0.02MB

 

결론부터 미리 말하자면, predict의 결과는 매우 무의미한 예측이다.
사용한 특성은 qqq와 동시에 움직이기 때문에, 특성으로 사용하기에는 부족하다,

다만, 시장에 존재하는 지표들을 적절히 활용하면, 비슷하게 예측이 가능할지도 모르겠다.
예측의 결과와 실제의 패턴이 비슷한 듯 보이지만,
실제로는 예측의 결과가 실제를 흉내 내는 것에 불과하다고 생각한다.

이번 프로젝트를 하며 퀀트전략들을 제대로 공부해보고, 직접 알고리즘 매매를 시도해보고 싶어졌다. 

 

 

참고한 블로그 List

pandas data merge

 

19. pandas 추가 – 데이터 합치기 2가지 방식(merging, concatenating)

여러개의 파일을 DataFrame으로 받아들인 뒤, 서로다른 DataFrame을 하나로 합치는 방법은 2가지가 있다. 1. 공통된 하나의 열(또는 행)을 기준으로, 동일한 값을 가지는 행을 각 DataFrame에서 찾은 뒤 n

nittaku.tistory.com

add : x0 col 

 

[Python Pandas] 7. 열 추가, 값 수정, 데이터 합치기

오늘은 열 추가, 값 수정, 데이터 합치기에 대해 예제를 들어 설명하겠습니다. 1. 데이터 프레임 생성 [소스] import pandas as pd friend_dict_list = [ {'name': 'John', 'age' : 15, 'job' : 'student'}, {'nam..

nalara12200.tistory.com

feature order

 

[파이썬 pandas] 데이터프레임 컬럼 순서 변경, 추가, 이름 바꾸기

판다스를 사용하다 보면 생각보다 자주 필요한 기능이 칼럼의 순서를 바꾸고, 새 컬럼을 추가하고, 이름을 변경하는 것입니다. 사용법이 어려운 기능들은 아니지만 아직 pandas가 익숙하지 않은

hogni.tistory.com

pandas key index 접근

 

11. pandas DataFrame 인덱싱(열 / 행 / boolean 인덱싱)

DataFrame을 생성해보자. Series도 있지만, 주로 사용할 데이터는 DataFrame이다. 필요한 패키지들을 import해놓고, 아래와 같이 python 딕셔너리를 만들고, DataFrame을 만드는데, 인자로 columns를 주어 키값=

nittaku.tistory.com

 

반응형

댓글()

[Leetcode] 211. Design Add and Search Words Data Structure

Algorithm|2021. 9. 28. 14:17
반응형

 

Identifying the Problem

Trie 구조, addword, search 기능을 구현한다.

단 search 기능에서 단어 중간에 '.' 이 있는 경우 pass하고 다음 글자로 넘어간다.

 

Example:

wordDictionary.addWord("bad");

wordDictionary.search(".ad"); 

return True

Organizing thoughts

Trie 와 addword는 208번 문제의 코드를 그대로 사용하고, search 부분을 정답코드 참고하였음.

 

 

[Leetcode] 208. Implement Trie (Prefix Tree)

Identifying the Problem Trie Tree를 생성하고, 삽입, 검색, 접두사 검색 (검색엔진의 자동완성) 함수를 구현한다. Organizing thoughts Trie에 관한 내용은 아래 블로그를 참고하였다. [자료구조] 트라이 (Trie)..

gold-goose.tistory.com

https://leetcode.com/problems/design-add-and-search-words-data-structure/discuss/774271/C%2B%2B-oror-Trie-Solution-oror-264-ms-Solution

Sourcecode

class TrieNode 
{
public:
    // TrieNode 객체 생성
    bool finish; //글자의 끝의 유/무 를 finish로 설정
    TrieNode *children[26]; //26개의 자식 노드 생성 ('a~z')
    
    TrieNode() //각 노드의 초기값 설정
    { 
        finish = false;  
        
        for (int i = 0; i < 26; i++)
            children[i] = NULL;
    }//처음 아무것도 없는 상태이므로 각 노드의 끝을 false와 NULL로 설정
};


class WordDictionary {
public:
    WordDictionary() 
    {
        root = new TrieNode(); //Trie 생성    
    }
    
    void addWord(string word) 
    {
        int word_len = word.length(); //단어의 길이
        int k = 0; //string -> int 알파벳 a~z 를 index로 사용하고자 k = 0~25 로 선언
        TrieNode *cur = root; //탐색노드 cur에 초기 TrieNode 대입
        
        for (int i = 0; i < word_len; i++) //단어의 한 글자씩 Trie 에 추가
        {
            k = word[i] - 'a';
            
            if (cur->children[k] == NULL) 
            {
                cur->children[k] = new TrieNode();
            }////해당 trie가 아무것도 없는 상태라면, 새로 하위 노드 생성
            
            cur = cur->children[k]; //다음 node로 이동
        }
        
        cur->finish = true; //단어의 끝 finish 값을 true로 설정 
        
    }
    
    bool search(string word) 
    {
        return searchHelper(word, root); //parameter를 수정한 search 함수
    }
        

    
private:
    TrieNode* root; //root 생성
    
    bool searchHelper(string word, TrieNode* current) 
    {
        for(int i = 0; i < word.size(); i++)
        {
            if(word[i] != '.'){ //기존 search 방식과 동일
                if(!current->children[word[i] - 'a']) 
                    return false;
                current = current->children[word[i] - 'a'];
            }
            else
            { // '.'이 단어 중간에 있는 경우
                for(int j = 0; j < 26; j++) // 다음 자식 노드 26개 모두를 탐색
                {
                    if(current->children[j] && searchHelper(word.substr(i + 1), current->children[j]))
                    { //다음 자식노드가 존재하고, 이후 다음 글자들이 Trie에 있는지 재귀로 탐색
                        return true; //하나라도 만족하면 true리턴
                    }
                }
                return false;
            }
        }
        return current->finish; //'.'이 없는 경우 단어의 끝에 해당하는 Trie->finish 값 리턴
    }
};

 

반응형

댓글()

[Leetcode] 208. Implement Trie (Prefix Tree)

Algorithm|2021. 9. 26. 13:10
반응형

Identifying the Problem

Trie Tree를 생성하고, 삽입, 검색, 접두사 검색 (검색엔진의 자동완성) 함수를 구현한다.

Organizing thoughts

Trie에 관한 내용은 아래 블로그를 참고하였다.

 

[자료구조] 트라이 (Trie) C++ 구현

트라이 (Trie) 우리가 여러 개의 문자열을 가지고 있을 때, 어떤 문자열이 그 문자열 중 하나인지 알아내는 방법을 생각해보자. 단순하게 일일히 비교하는 방법이 있겠지만, 이러한 방법은 매우

eun-jeong.tistory.com

Sourcecode

##source code 출처

 

C++, My solution, easy to understand:) - LeetCode Discuss

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

class TrieNode {
public:
    // TrieNode 객체 생성
    bool finish; //글자의 끝의 유/무 를 finish로 설정
    TrieNode *children[26]; //26개의 자식 노드 생성 ('a~z')
    
    TrieNode() //각 노드의 초기값 설정
    { 
        finish = false;  
        
        for (int i = 0; i < 26; i++)
            children[i] = NULL;
    }//처음 아무것도 없는 상태이므로 각 노드의 끝을 false와 NULL로 설정
};

class Trie {
public:
    Trie() 
    {
        root = new TrieNode(); //Trie 생성
    }

    // 단어를 Trie에 Inserts
    void insert(string word) 
    {
        int word_len = word.length(); //단어의 길이
        int k = 0; //string -> int 알파벳 a~z 를 index로 사용하고자 k = 0~25 로 선언
        TrieNode *cur = root; //탐색노드 cur에 초기 TrieNode 대입
        
        for (int i = 0; i < word_len; i++) //단어의 한 글자씩 Trie 에 추가
        {
            k = word[i] - 'a';
            
            if (cur->children[k] == NULL) 
            {
                cur->children[k] = new TrieNode();
            }////해당 trie가 아무것도 없는 상태라면, 새로 하위 노드 생성
            
            cur = cur->children[k]; //다음 node로 이동
        }
        
        cur->finish = true; //단어의 끝 finish 값을 true로 설정 
    }

    //search 하는 단어가 Trie내에 있다면 true 없다면 false 리턴
    bool search(string word) 
    {
        int word_len = word.length();
        int k = 0;
        TrieNode *cur = root;
        
        for (int i = 0; i < word_len; i++)
        {
            k = word[i] - 'a';
            cur = cur->children[k];
            
            if (cur == NULL)
                return false;
        }
        
        return cur->finish; 
        //insert 글자의 끝 부분을 true로 했을 경우 true 리턴이고 
        //아닐 경우 defalut값이 false이므로 false리턴
    }

    //prefix를 가지는 글자가 있는지 탐색
    bool startsWith(string prefix) 
    {
        int word_len = prefix.length();
        int k = 0;
        TrieNode *cur = root;
        
        for (int i = 0; i < word_len; i++)
        {
            k = prefix[i] - 'a';
            cur = cur->children[k]; //찾는 단어의 글자 순으로 탐색 
            
            if (cur == NULL) //Trie가 NULL이거나, 
                               //탐색할 다음 글자의 node가 NULL인 경우 false return
                return false;
        }
        
        return true; //defalut 값 true
    }

private:
    TrieNode* root; //root 생성
};
반응형

댓글()

[Leetcode] 235. Lowest Common Ancestor of a Binary Search Tree

Algorithm|2021. 9. 19. 13:27
반응형

Identifying the Problem

BST Tree 내의 p와 q의 공통 조상을 찾아 리턴한다.

Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 Output: 6

Explanation: 2와 8의 공통 조상은 6이다.

Organizing thoughts

##아이디어 참고 및 출처

 

C++ Recursive and Iterative - LeetCode Discuss

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

먼저 가능한 경우의 수를 정리해보자 

아래는  p, q가 root기준으로 위치한 곳에 따른 리턴 값이다.

p q return
왼쪽 왼쪽 왼쪽 어딘가
왼쪽 오른쪽 root
오른쪽 오른쪽 오른쪽 어딘가

즉 다음과 같은 경우가 됐을 때, 왼쪽 어딘가 혹은 오른쪽 어딘가를 전위순회로 탐색하다,

왼쪽 p 오른쪽 q가 되는 경우 또는 그 외의 경우

(q의 왼쪽 자손 노드가 p인 경우 or p의 오른쪽 자손 노드가 q인 경우)

root를 return 한다.

Sourcecode

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) 
    {
        if(root->val > p->val && root->val > q->val) //둘 다 왼쪽
            return lowestCommonAncestor(root->left, p, q); 
        if(root->val < p->val && root->val < q->val) //둘 다 오른쪽
            return lowestCommonAncestor(root->right, p, q);
        return root; //그 이외의 경우 root 리턴
    }
};
반응형

댓글()

[Leetcode] 105. Construct Binary Tree from Preorder and Inorder Traversal

Algorithm|2021. 9. 17. 15:20
반응형

Identifying the Problem

이진트리의 preorder 순회 결과와 inorder 순회 결과를 가지고 원래 트리를 만든다.

 

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] 

Output: [3,9,20,null,null,15,7]

Organizing thoughts

탐색

preorder[0]은 트리의 root부분이다.

나머지 부분은 root의 자식 node이다.

임의로 inorder의 요소를 pivot으로 지정했을 때

inorder[0] ~ inorder[pivot-1]의 값들은 pivot의 왼쪽에 위치하고,

inorder[pivot+1] ~ inorder[size-1]의 값들은 pivot의 오른족에 위치한다.

inorder[pivot] 왼쪽에 아무것도 없다면, 왼쪽 자식 노드는 null이고,

inorder[pivot] 오른쪽에 아무것도 없다면, 오른쪽 자식 노드는 null이다.

 

흐름

preorder = [3,9,20,5,7] , inorder = [9,3,5,20,7] 이라면,

pre를 level 별로 놓는다.

 

level  val val
0 3  
1 9 20
2 5 7

그 후에, inorder의 정보로, 자식노드를 결정한다.

순서는 preorder의 순서대로 진행한다.

 

처음 3은 inorder[1]에 위치하고,

inorder[1] 이전은 모두 3 left에 위치, 이후는 모두 right에 위치함을 알 수 있다.

 

다음 9는 inorder[0]에 위치하고,

inorder[0] 왼쪽에 아무것도 없으므로, 왼쪽 노드는 null,

오른쪽에는 3이 있지만, 이미 부모 노드인 것을 확인했으므로 오른쪽 노드도 null이다.

 

다음 20은 inorder[3]에 위치하고,

inorder[3] 이전은 모두 20 left에 위치, 이후는 모두 right에 위치함을 알 수 있다.

왼쪽에 9,3,15가 있지만, 이 중 9,3은 이전에 파악했으므로 왼쪽에 5만 있다고 생각한다.

 

다음 5는 inorder[2]에 위치하고,

왼쪽에 9,3이 있지만, 모두 이전에 파악했으므로, 왼쪽 노드는 null이다.

오른쪽에 20,7이 있지만, 20은 5의 부모노드인 것을 확인했으므로 오른쪽에도 아무것도 없다.

따라서 오른쪽 노드도 null이다.

 

마지막 7은 inorder[4]에 위치하고,

왼쪽은 이미 다 파악했고, 오른쪽은 아무것도 없어 둘다 null이 된다.

Sourcecode

## 정답 코드 및 출처

 

C++ simple recursive (+ detail explanation) - LeetCode Discuss

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
    {
        int index = 0; //preorder의 요소를 level 순으로 탐색
        return build(preorder, inorder, index, 0 , inorder.size() - 1);
    }
    TreeNode* build(vector<int>& preorder, vector<int>& inorder,int &index, int left, int right)
    {
        if(left > right) return NULL; //왼쪽 혹은 오른쪽에 아무것도 없다면, null 리턴
        
        int pivot = left; // pivot 초기화
        
        while(inorder[pivot] != preorder[index]) pivot++;
        //preorder[index] 값과 inorder의 같은 부분을 탐색
        
        index++;
        
        TreeNode* node = new TreeNode(inorder[pivot]);
        node->left = build(preorder, inorder, index, left , pivot-1);
        node->right = build(preorder, inorder, index, pivot+1 , right);
        //중위순회로 tree생성
        return node;
    }
};

 

반응형

댓글()

[Leetcode] 230. Kth Smallest Element in a BST

Algorithm|2021. 9. 15. 15:38
반응형

Identifying the Problem

BST 구조 트리의 k번째로 작은 값을 구한다.

Input: root = [5,3,6,2,4,null,null,1], k = 3 Output: 3

Organizing thoughts

Idea[1] : 중위순회를 하며, int vector에 node값 저장 후 , 정렬 , 앞에서 k-1 번째 수 리턴한다.

Idea[2] : 중위순회를 하며, k값을 빼가며 k가 1에 도달했을 때의 값을 리턴한다.

Sourcecode

##Idea[1]

class Solution {
public:
    vector<int> node;
    
    int kthSmallest(TreeNode* root, int& k) 
    {
        inorder(root);
        sort(node.begin(), node.end());
        return node[k-1];
    }
    
    void inorder(TreeNode* root)
    {
        if(root)
        {
            inorder(root->left);
            node.push_back(root->val);
            inorder(root->right);
        }
    }
};

 

##Idea[2] 정답코드 및 출처 

 

 

4 Lines in C++. - LeetCode Discuss

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

class Solution {
public:
    int kthSmallest(TreeNode* root, int& k) 
    {
        if (root) 
        {
            int x = kthSmallest(root->left, k);
            return !k ? x : !--k ? root->val : kthSmallest(root->right, k);
        }
        else return NULL;
    }
};

위 코드는 가독성이 떨어져 가독성이 좋은 코드를 찾아 해설해보았다.

class Solution {
public:
    int kthSmallest(TreeNode* root, int k) { 
        return dfs(root, k);
    }
    int dfs(TreeNode* node, int& k) //int k 가 아니라 int& k 를 사용해 k값을 직접 변경한다.
    {
        if(!node) return NULL; //node가 없다면 null 리턴
        
        int l = dfs(node->left,k); //BST 구조이므로 중위순회
        
        if(k == 0) return l; //전달 받은 node->val 값 리턴, root로 다시 돌아올 때 k가 0인 상태가 된다.
        
        else if(k == 1) //k가 1일 때의 값이 k번 째 값이므로
        {
            k--; //k를 0으로 만들고, 정답 리턴
            return node->val;
        }
        else // k가 1보다 크면, 
        {
            k--; //k를 1 줄이고 (탐색했다는 흔적)
            int r = dfs(node->right,k); //오른쪽으로 중위순회를 이어나간다.
            if(k==0) return r; //오른쪽 탐색결과 정답을 찾았으면 정답 값 리턴
            else return NULL; //오른쪽이 빈노드거나 오른쪽을 탐색해도 못찾으면, null 리턴
        }
    }

};

Mistake

  • tree도 하나의 dp 라고 생각하니 편하다.
  • tree문제 풀 때, 최소단위의 트리를 가정해 생각해보면 수월하다.

New things learned

 

삼항연산자를 이중으로 사용했을 때 이해가 잘 안가 찾아보았다.

 

삼항연산자, 이중 삼항연산자

삼항연산자는 조건 ? true일 경우 실행 내용 : false일 경우 실행 내용 형태의 연산문이다.조건이 충족될 경우 :를 기준으로 앞의 내용이 실행되며, 충족되지 않을 경우 뒷부분의 내용이 실행된다.

velog.io

 

반응형

댓글()

[Leetcode] 98. Validate Binary Search Tree

Algorithm|2021. 9. 14. 15:38
반응형

Identifying the Problem

이진트리를 탐색하며, 왼쪽 하위 트리로 갈수록 값이 작아지고, 오른쪽 하위 트리로 갈 수록 값이 커지는지 판단한다.

Input: root = [5,1,4,null,null,3,6] Output: false

Explanation: root 5의 오른쪽 노드 값이 4로 작아졌다.

Organizing thoughts

// 72 / 80 test cases passed.

class Solution {
public:
    bool isValidBST(TreeNode* root) 
    {
        if(!root) return true;
        //가장 마지막 null은 true로 리턴 (defalut)
        
        if(root->left && root->val <= root->left->val){cout<<"1\n"; return false;} 
        //주어진 조건과 반대가 되는 순간 false를 return
        //root->left, right가 null인 상태에서 val을 접근하면 오류가 나기 때문에
        //left,right가 null이 아니라는 조건을 추가했다.
        if(root->right && root->val >= root->right->val) {cout<<"2\n"; return false;} 
        
        
        return isValidBST(root->left) && isValidBST(root->right); //중위 순회
    }
};

 

Mistake

오른쪽 노드의 값의 왼쪽 노드의 값은 최초 root노드 보다는 작아야 한다.

root < root->right->left < root->right 이런 셈이다 (val은 편의상 생략)

https://leetcode.com/problems/validate-binary-search-tree/discuss/1176115/Why-is-546nullnull37-not-a-valid-BST

Answer Sourcecode

정답코드 출처

 

C++ simple recursive solution - LeetCode Discuss

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

## 전체적인 flow는 나와 유사하다.

left 검사 시에는 이전 값을 최대값으로 두고, 다음으로 넘겼고,

right 검사시에는 이전 값을 최소값으로 두어 다음을 넘긴다.

하지만 내가 실수한 왼쪽과 오른쪽의 세부적인 디테일을 이 코드에선 min과 max를 넘김으로 해결했다.

class Solution {
public:
    
    bool isValidBST(TreeNode* root) 
    {
        return isValidBST(root, NULL, NULL);
    }

    bool isValidBST(TreeNode* root, TreeNode* minNode, TreeNode* maxNode) 
    {
        if(!root) return true;
        if(minNode && root->val <= minNode->val || maxNode && root->val >= maxNode->val)
            return false;
        return isValidBST(root->left, minNode, root) && isValidBST(root->right, root, maxNode);
    }
};

 

반응형

댓글()

[Leetcode] 98. Validate Binary Search Tree

Algorithm|2021. 9. 14. 15:12
반응형

Identifying the Problem

subtree가 tree내에 있다면, true 없다면, false를 리턴한다.

Input: root = [3,4,5,1,2], subRoot = [4,1,2] Output: true

Organizing thoughts

먼저 크게 4가지로 subtree와 tree의 경우를 표로 나타낼 수 있다.

Tree Subtree Result
null null true
o null false
null o false
o o true / false

IDEA

[1] tree를 탐새하면서, tree->val과 subtree->val 이 같은 순간이 오면,

    두 트리를 동시에 탐색하면서 완전히 동일한지 판단한다.

    하지만, 위 예시에서 불필요하게 tree의 level 0과 subtree의 level 0이 동일한지 확인해야한다.

[2] 따라서 1의 단점을 보완해, subtree의 깊이가 같은 곳만 (가장 밑에서의 높이가 같은 곳의 node) 를 뽑아 subtree와        동일한지 판단한다.

[3] tree와 subtree의 값들을 배열에 저장해 subtree 배열의 값이 tree 내에 존재하는지 파악한다.

    하지만, 이는 문제의 의도와는 맞지 않으므로 이 방법으로 풀지는 않겠다.

Sourcecode

소스코드는 2번의 아이디어로 작성되었다.

 

정답 코드의 flow (편의상 subtree의 root를 s, tree의 root를 t로 놓겠다)

 

1. t와 s 둘 다 null이면 true, 둘 중 하나만 null이면 false 리턴

2. s의 깊이를 파악

3. t에서 밑에서 s깊이의 높이에 위치한 노드를 모두 저장

4. 저장된 노드와 s가 같은지 반복하며 비교

 

정답 코드의 출처

 

19ms C++ solution beats 99.9% - LeetCode Discuss

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

class Solution {
    vector<TreeNode*> nodes;

public:
    bool isSubtree(TreeNode* s, TreeNode* t) {
        if (!s && !t) return true; //둘다 null이면 true
        if (!s || !t) return false; //하나만 null이면 false

        getDepth(s, getDepth(t, -1)); //s의 깊이를 구하고, s의 깊이에 해당하는 node저장

        for (TreeNode* n: nodes) //저장한 node들과 s가 같은지 확인
            if (identical(n, t))
                return true;

        return false; //defalut 값 false
    }

    int getDepth(TreeNode* r, int d) 
    {
        if (!r) return -1;
        // -1인 이유 : 1. 가장 아래서부터 높이를 더하기 때문
        //2. t에서 s와 높이가 같은 노드를 저장해야 하는 데, 
        //   s의 높이를 구하는 과정에서 d가 0보다 클 경우, 
        //   저장 node에 s의 node가 들어가는 것을 막고자
        
        int depth = max(getDepth(r->left, d), getDepth(r->right, d)) + 1;
        //중위순회하며 높이 구하기
        
        if (depth == d) //t-node 의 높이가 s의 높이와 같다면 해당 t-node 저장
            nodes.push_back(r);

        return depth;
    }

    bool identical(TreeNode* a, TreeNode* b) 
    {
        if (!a && !b) return true; //둘다 null이면 true
        if (!a || !b || a->val != b->val) return false; 
        //하나만 null이면 혹은 둘의 값이 다르면 false 

        return identical(a->left, b->left) && identical(a->right, b->right);
        //false 가 하나라도 잡히면 false 리턴
    }
};

 

반응형

댓글()

[Leetcode] 102. Binary Tree Level Order Traversal

Algorithm|2021. 9. 11. 12:35
반응형

Identifying the Problem

이진트리의 레벨별로의 값들을 묶어 2차원 벡터로 리턴한다.

 

 

Input: root = [3,9,20,null,null,15,7] Output: [[3],[9,20],[15,7]]

Organizing thoughts

이진 트리의 탐색 깊이가 깊어질 때,

2차원 벡터의 size를 하나 씩 늘리며,

해당 깊이에 해당하는 값을 2차원 벡터에 추가한다.

Sourcecode

class Solution {
    
public:
    vector<vector<int>> ans; //정답 벡터
    int max_depth = 0; 
    //resize가 줄어들게 되면, 기존 값들이 다 없어지기에, 최대 size를 유지해준다.
    
    vector<vector<int>> levelOrder(TreeNode* root) 
    {
        if(!root) return ans; //빈 트리면 null 리턴
        
        ans.push_back(vector<int>()); //행 추가
	    ans[0].push_back(root->val); //root 값 추가
        
        insert(root->left,1); //재귀로 깊이 탐색
        insert(root->right,1);
        
        return ans;
    }
    void insert(TreeNode* root, int c)
    {
        if(!root) return;
        
        else
        {
            max_depth = c > max_depth? c : max_depth; //깊이가 늘어나면 최대 깊이 수정
            ans.resize(max_depth+1); //최대 깊이에 맞게 size 수정한다.
            ans[c].push_back(root->val); //레벨에 맞는 곳에 값 추가
            
            insert(root->left,c+1);
            insert(root->right,c+1);
        }
    }
};

 

New things learned

  • c++ resize를 사용시 size가 5였다가 3으로 다시 준다면, size가 5였을 때 값은 다 날라간다.
 

c++ vector reserve vs resize : 미리 공간을 만들어 놓고 쓰면 안 될까요?

 예전에 vector가 인자로 들어왔을 때, 어떻게 해야 되는지를 올렸습니다. 어느 분이 댓글로 피드백을 주셨습니다. 그 내용에 관해서 보강 설명을 하도록 하겠습니다. 사실 동적 배열에서 중요한

codingdog.tistory.com

 

반응형

댓글()