Principle: LIFO (First In First Out)

Header: <stack>

Methods: push(), pop(), top()

Examples: Check balance for Parenthesis (), Braces {}, Brackets []

You've learned how to use stacks in C++ for various applications. Now, put your knowledge to the test by evaluating an expression in Reverse Polish Notation (also known as postfix notation), where operands precede the operator. In other words, the operator comes after the two numbers on which it is supposed to operate.

Your task is to write a function that processes such an expression and returns the result. Remember, in a Reverse Polish Notation expression like "1 2 + 4 -", the operation is performed from left to right. This means you first add 1 and 2, and then subtract 4 from the result, getting -1 as a final result.

Assume the expression only includes + and - operators. Hint: you can use std::stoi to convert a (numeric) string into an integer value.
#include "solution.hpp"

#include <climits>

int evaluate_reverse_polish_notation(const std::string &expression) {
    // TODO: processe a RPN expression and return the result
    std::stack<int> value;
    
    for (const auto& ch : expression) {
        if (ch != ' ') {
            if (ch == '+') {
                if (value.size() < 2) {
                    return INT_MIN;
                }
                
                int back = value.top();
                value.pop();
                int front = value.top();
                value.pop();
                
                value.push(back+front);
            } else if (ch == '-') {
                if (value.size() < 2) {
                    return INT_MIN;
                }
                
                int back = value.top();
                value.pop();
                int front = value.top();
                value.pop();
                
                value.push(front - back);
            } else {
                value.push(ch - '0');
            }
        }
    }
    
    if (value.size() == 1) {
        return value.top();
    } else {
        return INT_MIN;
    }
}


int main() {
    // The expression "1 2 + 4 -" is "(1 + 2) - 4"
    std::cout << evaluate_reverse_polish_notation("1 2 + 4 -") << std::endl; // Expected output: -1
    return 0;
}

'테크 > CodeSignal-C++' 카테고리의 다른 글

6. Browsing system for Deque  (0) 2024.11.30
5. Map using custom object key  (0) 2024.11.29
4. Multimap to Map  (0) 2024.11.28
3. Map & Multimap  (0) 2024.11.26
2. Queue and Deque  (0) 2024.11.23

 최근 특정 기업의 채용 공고를 보는데 EC2에서 EKS로 넘어갔다고 했다. 나는 오래 전 AWS에서 EC2를 받아서 사용은 해봤지만 EKS는 처음 들었던 단어였기에 생소해서 AI에게 물어보았다. Docker는 조금 다른 개념이긴 하지만 그래도 내 생각으로는 EC는 클라우드 VM과 같은 존재여서 같이 껴넣어서 비교해달라고 했다. 답변을 보고 EKS로 넘어갔다는 것은 그 기업은 EC2를 활용한 인프라에서 쿠버네티스 위에 인프라를 구축했다는 의미라는 것을 알게 되었다.

1. EC2 (Elastic Compute Cloud)

개요

  • AWS가 제공하는 가상 서버.
  • 사용자가 OS, 소프트웨어, 네트워크 등 모든 것을 직접 설정 및 관리.

특징

  • 유연성: 완전한 서버 접근 권한. 원하는 대로 OS와 애플리케이션 설치 가능.
  • 관리 부담: 패치, 스케일링, 장애 복구 등 모든 관리를 직접 해야 함.
  • 운영 방식: 전통적인 서버 기반으로, 애플리케이션이 컨테이너화되지 않아도 동작.

장점

  • 높은 커스터마이징 가능성.
  • 다양한 워크로드 처리 가능 (웹 서버, DB 서버 등).
  • 간단한 소규모 프로젝트에 적합.

단점

  • 관리 복잡도 증가.
  • 리소스 활용 비효율 가능 (서버 과잉 또는 부족).

2. Docker

개요

  • 컨테이너화 기술로, 애플리케이션과 필요한 환경을 패키징하여 독립적으로 실행.
  • Docker 자체는 AWS 서비스가 아니라 컨테이너화 도구이며, AWS에서는 EC2나 EKS 같은 서비스를 통해 실행.

특징

  • 이식성: 컨테이너는 어디서나 동일하게 실행.
  • 경량화: 가상머신(VM)보다 리소스 사용이 적음.
  • EC2, ECS, EKS 같은 서비스에서 컨테이너를 실행할 수 있음.

장점

  • 환경 독립성: 개발 환경과 운영 환경 차이를 최소화.
  • 빠른 배포 및 스케일링.
  • 인프라 활용 효율성 증가.

단점

  • 컨테이너 환경 관리 필요.
  • 단독으로는 클러스터링이나 확장 기능 부족 (ECS/EKS와 결합 필요).

3. EKS (Elastic Kubernetes Service)

개요

  • AWS의 쿠버네티스(Kubernetes) 관리 서비스.
  • 컨테이너화된 애플리케이션을 관리하고 확장하며 배포하는 데 사용.

특징

  • 자동화: 스케일링, 배포, 로드 밸런싱 등 컨테이너 클러스터 관리 자동화.
  • 복잡성: EC2나 Docker보다 초기 설정과 운영이 복잡할 수 있음.
  • 관리형 서비스: AWS가 쿠버네티스의 제어 플레인을 관리하므로 일부 부담 완화.

장점

  • 고가용성과 자동화된 스케일링.
  • 복잡한 멀티컨테이너 애플리케이션 배포에 적합.
  • 클러스터 환경에서 리소스를 효율적으로 운영 가능.

단점

  • 러닝 커브가 있음 (쿠버네티스 이해 필요).
  • 소규모 프로젝트에는 과도한 솔루션일 수 있음.

4. 주요 차이점

기능/특징EC2Docker (단독)EKS

운영 방식 전통적인 서버 기반 컨테이너 기반 컨테이너 클러스터 기반
관리 범위 사용자 전담 (OS, 서버 등) 컨테이너 이미지 관리 필요 AWS가 제어 플레인 관리
자동화 수준 낮음 제한적 (컨테이너 스케줄링 없음) 높음 (스케일링, 로드 밸런싱 자동화)
스케일링 수동 제한적 자동 (노드/컨테이너 수준)
복잡성 낮음 중간 높음
적합한 환경 소규모/전통적 애플리케이션 컨테이너화된 애플리케이션 대규모 분산 애플리케이션

5. 결론

  1. EC2: 서버를 완전히 관리해야 하는 상황에서 사용. 소규모 애플리케이션이나 초기 단계에서 적합.
  2. Docker: 애플리케이션을 컨테이너화하여 이식성을 높이고 싶을 때 사용. 단일 Docker 실행은 EC2나 ECS에서.
  3. EKS: 대규모, 복잡한 컨테이너화 애플리케이션을 효율적으로 관리하고 자동화하려면 사용.

 유사 .NET 개발자였던 내게 갑자기 Spring Boot API 서버 개발 업무가 주어졌다. 이미 완성된 시스템에서 유지보수나 하던 내게 새로운 프레임워크로 처음하는 백엔드 개발 업무는 생소했다. 그래서 당연히 AI에게 도움을 요청했다. 그리고 어느정도 개발이 완료되어 출시를 앞둔 지금 느끼기에 AI가 설명해준 순서는 정말 정석이었다.

 

1. 요구사항 분석 및 도메인 모델 설계

  • 요구사항을 명확히 정의한 후, 도메인 모델을 설계합니다. 도메인 모델이란 시스템에서 사용될 엔티티(entity)와 그 관계를 정의하는 것으로, 실제 비즈니스 로직을 반영합니다.
  • 예를 들어, "유저가 상품을 주문한다"는 요구사항이 있다면 User, Product, Order와 같은 엔티티가 필요합니다.

: 제일 힘들었다. 요구사항이 수시로 바뀌고 수시로 회의를 하지만 아무도 이해하지 못한 그림으로 서로 이야기만 한다.

2. 엔티티(Entity) 클래스 설계

  • 객체 지향의 캡슐화 원칙에 따라 필요한 속성과 메서드를 가지는 엔티티 클래스를 만듭니다.
  • JPA를 활용해 데이터베이스 매핑을 설정하며, 엔티티 간의 관계도 명확히 설정합니다. 예를 들어, User와 Order는 @OneToMany 관계가 될 수 있습니다.

: 관계형 DB와 함께 설계를 진행했다. 외래키의 경우 단순히 키가 아닌 외래키의 대상이 되는 Entity를 멤버로 가진다.

3. 레포지토리(Repository) 인터페이스 생성

  • 데이터베이스에 접근하는 인터페이스를 Repository 패턴을 사용해 정의합니다. Spring Data JPA를 활용해 각 엔티티의 CRUD 기능을 담당할 레포지토리를 생성하며, 엔티티별로 필요한 커스텀 메서드도 추가합니다.

: Repository에서 DB의 데이터를 가져온다. 동시성 제어를 위해 비관적 락을 사용하였다.

4. 서비스(Service) 레이어 설계

  • 비즈니스 로직을 수행하는 서비스 클래스를 생성합니다. 서비스는 레포지토리에서 데이터를 조회하고, 비즈니스 규칙을 적용하여 필요한 경우 데이터를 처리합니다.
  • 이때, 서비스 계층이 도메인 로직의 핵심이 되도록 설계하고, 가능하면 @Transactional 어노테이션을 통해 트랜잭션 처리를 설정합니다.

: Circular 참조 문제가 발생하였다. A와 B가 각각 서로 서비스를 멤버로 가지면 안된다. 인터페이스를 상속받아 느슨한 결합을 한다.

5. DTO(데이터 전송 객체) 설계

  • DTO를 사용하여 엔티티와 API 응답 간의 매핑을 수행합니다. 클라이언트로 보내거나 클라이언트로부터 받는 데이터만을 포함하는 DTO를 만들어, 필요한 데이터만 노출합니다.
  • 예를 들어, UserDTO와 같은 객체를 만들어 User 엔티티를 그대로 노출하지 않고 필요한 데이터만 담아 전달합니다.

: DTO를 설계 후 API Parameter로 Json 객체로 받는다. Json 객체로 parameter를 받기에 REST의 형식은 POST다.

6. 컨트롤러(Controller) 설계

  • RESTful API를 제공하는 Controller 클래스를 생성하여 요청을 받아 처리합니다.
  • 클라이언트로부터 HTTP 요청을 받고, 필요한 경우 서비스 레이어로 해당 요청을 전달합니다. 요청을 받은 후 DTO로 변환해 응답합니다.

: API 서버의 직접적으로 유저와 통신하는 부분이다. URL을 정의하고 Controller는 서비스를 가지고 서비스는 Repository를 가진다.

7. Exception Handling 설계

  • @ControllerAdvice와 같은 어노테이션을 통해 전역 예외 처리기를 구현합니다. 비즈니스 로직에서 발생할 수 있는 예외들을 정의하고, 적절한 HTTP 상태 코드와 함께 사용자에게 명확한 에러 메시지를 반환할 수 있도록 합니다.

: 예외 발생 시 서버에 로그를 작성해도 되고 각 예외별 에러 코드를 정의하여 클라이언트에게 전송해도 된다.

8. 테스트 작성

  • 단위 테스트통합 테스트를 작성하여 각각의 클래스와 계층이 제대로 동작하는지 확인합니다. 특히 서비스와 컨트롤러 레이어는 @WebMvcTest와 같은 Spring의 테스트 어노테이션을 활용해 테스트합니다.
  • Mocking을 통해 서비스 계층에서 레포지토리를 모의(mock)하여 테스트할 수 있습니다.

: 아쉽게도 테스트 작성은 제대로 진행하지 못했다. C++과 다르게 어노테이션으로 쉽게 테스트를 할 수 있는 것 같다.

9. 리팩토링 및 추가적 설계 패턴 적용

  • 코드가 안정화되면, 객체 지향 설계 원칙에 따라 코드의 결합도를 낮추기 위해 의존성 주입(DI), 팩토리 패턴, 전략 패턴과 같은 설계 패턴을 추가 적용합니다.
  • 예를 들어, 특정 비즈니스 로직이 자주 변경되는 경우 전략 패턴을 통해 코드의 유연성을 높일 수 있습니다.

: 무에서 시작하다보니 미흡했던 설계가 눈에 보인다. 일정에 급급해 일단 만들기는 했지만 조금 더 간결하고 명확한 설계를 위해 개선점들이 보인다. 더 개선하고 싶었지만 이제 해당 업무에서 손을 떼므로 더이상 진행할 수 없는게 아쉽다.

엊그제 블라인드에서 한 친구가 갑자기 VIX 지수가 엄청 올랐는데 이거 왜이러냐라는 질문글이 올라왔다.

요즘 유독 투자에 관심이 많아진 내게 VIX 지수라는게 궁금해졌다.

결론부터 말하면 미국이 우크라의 미사일 거리 제한을 해제했고 이에 따라 푸틴이 핵무기 위협을 해서 올라간 것이다.

이 VIX 지수를 보는법은 간단하다.

구글에서 VIX 지수를 검색하면 된다.

아직 핵전쟁을 걱정할 단계는 아닌듯하다.

 

VIX 지수(Volatility Index)는 시장 변동성을 나타내는 지표로, 공포 지수(Fear Index)라고도 불립니다. 이 지수는 미국 주식시장의 대표적인 변동성 지표로, S&P 500 지수 옵션의 내재 변동성(Implied Volatility)을 기반으로 계산됩니다.

VIX의 특징

  1. 변동성을 예측
    • VIX는 앞으로 30일 동안의 S&P 500 지수의 기대 변동성을 나타냅니다.
    • 숫자가 높을수록 변동성이 크다는 뜻이고, 낮을수록 안정적이라는 뜻입니다.
  2. 공포 지수로 불리는 이유
    • VIX가 상승하면 시장이 불안정해지고, 투자자들이 위험을 더 많이 느낀다고 해석됩니다.
    • 예를 들어, 금융위기, 코로나19 팬데믹 등과 같은 사건으로 인해 시장이 급격히 흔들릴 때 VIX가 급등했습니다.
  3. 수치 해석
    • VIX ≤ 20: 시장이 비교적 안정적임을 의미.
    • 20 < VIX ≤ 30: 변동성이 커지고, 시장에 불안감이 증가.
    • VIX > 30: 시장이 매우 불안정하며, 공포가 커졌음을 의미.
  4. 실시간 계산
    • 시카고옵션거래소(CBOE)가 실시간으로 VIX 지수를 계산하고 제공합니다.

VIX 계산 방법

  • VIX는 S&P 500 지수 옵션(콜 옵션과 풋 옵션)의 가격 데이터를 바탕으로 계산됩니다.
  • 옵션 가격은 시장의 내재 변동성을 반영하기 때문에, 이를 통해 미래의 변동성을 간접적으로 측정할 수 있습니다.
  • 복잡한 수학 공식에 기반하지만, 간단히 말해 옵션 가격이 높아질수록 VIX도 상승합니다.

VIX와 시장의 관계

  • VIX 상승:
    • 투자자들이 주식 하락 위험을 피하기 위해 풋 옵션(하락에 베팅하는 옵션)을 더 많이 매수하는 경향이 나타남.
    • 이는 시장의 불안 심리, 즉 공포를 반영합니다.
  • VIX 하락:
    • 시장이 안정적으로 보이고, 주가가 비교적 꾸준히 상승할 것으로 예상.

투자 활용

  1. 헤지(Hedging)
    • VIX는 선물(Futures)이나 ETF를 통해 거래가 가능합니다.
    • 변동성이 커질 때 VIX를 매수하여 포트폴리오의 손실을 방어하는 데 사용합니다.
  2. 투기(Trading)
    • 단기적인 시장 변동성에 베팅하기 위해 VIX 선물이나 관련 파생 상품에 투자하는 경우도 많습니다.

실생활 예시

  • 2008년 글로벌 금융위기 당시 VIX 지수는 80 이상으로 치솟으며 역사적 고점을 기록.
  • 코로나19 팬데믹 초기(2020년 3월), 시장이 급격히 하락하면서 VIX도 82.69로 급등.
  • 안정적인 시장에서는 VIX가 10~20 사이에 머무르는 경우가 많습니다.

요약

VIX는 미래 시장의 변동성을 예측하고 투자 심리를 반영하는 중요한 지표로, 시장의 위험을 평가하거나 투자 전략을 수립하는 데 유용하게 활용됩니다.

+ Recent posts