반응형
더보기

 

 

TON (The Open Network)

일명 (분산형 개방형 인터넷 플랫폼)

TON 블록체인


Blockchain of Blockchains

Single Actor

  • Actor 는 스마트 컨트랙트 , Account 와 같이 블록체인 엔티티를 설명하는데 사용되는 말이다.

TON 에서는 address code data balance 같은 속성들이 있다. 이러한 객체들은 storage , behavior 를 가지고 있다. 이러한 behavior 는 다음과 같은 패턴을 보인다.

  1. 무슨일이 발생 (보통은 컨트랙트가 메시지를 가져올때)
  2. TON 버추얼 머신에서 code를 실행한 이벤트에 따라 컨트랙트가 작동한다.
  3. code data 와 같은 속성들을 컨트랙트가 변경한다.
  4. 컨트랙트는 선택적으로 출력 메시지를 발생시킨다.
  5. 컨트랙트는 다음 이벤트가 발생할 때까지 대기한다.

The Lowest Level : Account Chain

트랜잭션의 시퀀스 Tx1 -> Tx2 -> Tx3 -> ...체인 이라고 부른다.

AccountChain 은 트랜잭션의 단일 계정의 체인을 강조하기 위한 말이다.

트랜잭션을 처리하는 노드는 스마트 컨트랙트의 상태를 조정해야 하므로 다음과 같은 순서로 배치된다. [Tx1 -> Tx2] -> [Tx3 -> Tx4 -> Tx5] -> [] -> [Tx6]

이렇게 되는 배칭은 컨트랙트의 시퀀싱에는 영향을 미치지않는다. 각각의 트랜잭션은 오직 하나의 이전 트랜잭션과 최대 하나의 다음 트랜잭션을 가진다. 이러한 시퀀스는 Block 으로 잘리게 된다.

블록이 들어오거나 나가는 메시지를 담는 큐를 포함하는 것도 편리하다. 이러한 경우에는 블록에 블록에서의 스마트 컨트랙트에서 무슨 일이 생기는지에 대해 설명된 정보의 전부가 포함이 될것이다.

Many AccountChains: Shards

몇개의 AccountChains 를 ShardChain 라고 한다. ShardChain 을 또한 ShardBlocks 로 나눌 수 있다. SharBlocks 는 개개인의 AccountBlocks 를 포함하고 있다.

ShardChains 를 동적으로 분리하고 병합

ShardChain 은 구분하기 쉬운 AccountChains 로 구성되어있다. 따라서, 쉽게 분리가 가능하다. 예를 들어 1million 개의 계정에서 일어나는 이벤트를 처리하는 ShardChain 1개가 있고 초당 거래가 너무 많아 하나의 노드에서 처리하고 저장할 수 없다면 ShardChain 을 두 개로 나눌 수 있다.

또한, 일부 Shard 에서 사용되지 않는 부분이 생기면 하나의 더 큰 ShardChain 으로 병합할 수 있다.

각각의 계정은 메시지를 보내서 상호작용할 수 있다. 메시지 발신큐에서 수신큐로 옮기고 이러한 메시지를 broadcast 할 수 있는 특별한 라우팅 메커니즘이 있다.

  1. 모든 메시지는 전달되어진다.
  2. 모든 메시지는 연속적으로 전달된다. (순서가 보장된다.)

BlockChain

모든 계정을 담은 Shard 의 집합이 일련의 규칙을 따르는 것을 블록체인 이라고 한다.

TON 에서는 다양한 규칙이 있으며 많은 블록체인들은 동시에 작동되고, crosschain 들과 메시지를 보내면서 상호작용한다. 같은 방식으로 한 체인안에 계정들도 서로 의사소통할 수 있다.

Workchain : 당신만의 규칙을 가진 블록체인

Shardchain 들의 그룹을 커스텀하고 싶다면 Workchain 을 만들 수 있다. 솔리디티로 구현된 스마트 컨트랙트를 EVM에서 작동하는 것이 그 예이다.

이론적으로, 커뮤니티 안의 모든 구성원은 자신만의 워크체인을 만들 수 있는데 사실 약간 복잡하다. 워크체인을 만들려면 돈도 많이들고 2/3 의 구성원들의 찬성이 필요하기 때문이다.

현재 TON 에는 2개의 워크체인이 있다. (MasterChain, BaseChain)

BaseChain

  • 값이 싸기에 모든 트랜잭션에서 거의 사용된다.

MasterChain

  • TON 의 중요한 함수들을 가지고 있다.

MasterChain : 블록체인들의 블록체인

메시지 라우팅과 트랜잭션 실행에 있어 동기화는 중요하다. 여러 체인들의 상태를 관리하고 고치는데 있어 노드들은 어떠한 방법이 필요하다.

따라서, TON 은 MasterChain 을 만들었다. 마스터 체인의 블록들은 시스템에서 모든 블록들의 정보를 가지고 있다. 그렇기에 observer 은 명확하게 멀티체인 시스템의 상태를 결정할 수 있다.

반응형
반응형

배경

오랜만에 쭈꾸미 집을 들려 안부 인사를 묻고 웹사이트는 문제 없냐 물어봤다. 그런데 직원 핸드폰에서는 접속이 잘되는데 가끔 외국인 핸드폰에서는 404 에러가 뜬다고 한다. 아니 이런.. 그게 무슨 말이야?! 왜지 왤까.. 집에가면서 계속 생각을 해봤고 아무래도 vercel 에서 해외 IP 차단을 한 것 일 수도 있다고 생각이 들었다.

 

부랴부랴 집에 와서 vercel 에서의 내 프로젝트를 확인해 오류 로그를 보려고 하니 아뿔싸 분석기는 따로 import 해서 layout.tsx 에 넣어야 작동을 한다는 것!?

 

바로 설치해.

 

Step 1 : npm 설치

 

npm i @vercel/analytics

위 명령어를 실행하면 자동으로 패키지가 설치된다.

 

 

무이스~! 아주 잘 설치가 됐군요

 

Step 2 : Layout.tsx 에 컴포넌트를 넣는다.

 

 

Layout.tsx 에 위처럼 Analytics 를 불러온다.

 

 

이후에 body 태그 안에 예쁘게 붙여 넣는다.

 

Step 3 : Publish

 

git에 저장하면 자동으로 deploy!

 

https://vercel.com/docs/analytics/quickstart#add-the-analytics-component-to-your-app

 

Vercel Web Analytics Quickstart

Vercel Web Analytics provides you detailed insights into your website's visitors. This quickstart guide will help you get started with using Analytics on Vercel.

vercel.com

 

 

 

위 사진처럼 이제 방문객을 확인할 수 있다.

그런데..

이제 해외 IP 에서 웹 사이트를 접속해보려고 VPN 을 이용해 접속해보았다. 그런데 오류가 시뮬레이션이 되지 않았다...

 

도대체 무엇이 문제일까..

지속적인 로그 확인을 통해 지켜보아야겠다.

반응형
반응형

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

 

문제 개요
이 문제는 우주선이 현재 위치에서 목표 위치로 이동할 때, 주어진 규칙에 따라 최소한의 이동 횟수를 구하는 문제이다. 이동하는 규칙은 다음과 같다:

  1. 우주선은 매번 이동할 때마다 "최대 속도"가 1만큼 변할 수 있다. 이 최대 속도는 1부터 시작하며, 속도는 양수만 가능하다.
  2. 우주선이 목표 위치에 도달하기 전까지 속도를 감소시킬 수 없다. 즉, 우주선이 목표 위치에 도달할 때까지 속도는 증가하거나 일정하게 유지될 수 있다.
  3. 목표 위치에 도달한 순간에는 속도가 0이 된다.

입력
입력의 첫 줄에는 테스트 케이스의 수 T가 주어진다. 각 테스트 케이스는 두 정수 (x)와 (y)로 이루어져 있으며, 이는 우주선의 현재 위치와 목표 위치를 나타낸다. (0 ≤ x < y ≤ (2^{31}-1))

출력
각 테스트 케이스에 대해, 목표 위치에 도달하기 위한 최소 이동 횟수를 출력한다.

문제 풀이

이 문제를 풀기 위해서는 특정 패턴을 찾는 것이 중요하다. 먼저, 거리 (d = y - x)를 계산한 뒤, 이 거리에 도달하기 위해 우주선이 취할 수 있는 이동 패턴을 살펴봐야 한다.

1. 거리 분석

우주선이 움직일 수 있는 패턴은 다음과 같다:

  • 시작할 때 속도를 1씩 증가시키다가, 일정 속도로 유지한 후, 다시 1씩 감소시키며 목표 위치에 도달한다.
  • 증가하는 속도 구간과 감소하는 속도 구간의 대칭성을 고려해야 한다.

2. 움직임 패턴

  • 거리 (d)에 대해, 속도를 증가시켜서 움직일 수 있는 최대 거리와 그에 필요한 횟수를 계산한다.
  • 그 후, 남은 거리만큼 추가적인 이동이 필요한지 판단한다.

이동 패턴 정리

  • (n^2 \leq d < (n+1)^2) 일 때, 이 거리를 최소한의 이동으로 도달할 수 있는 패턴은:
    • (d = n^2) -> 총 2n - 1번 이동
    • (n^2 < d \leq n^2 + n) -> 총 2n번 이동
    • (n^2 + n < d < (n+1)^2) -> 총 2n + 1번 이동

이를 바탕으로 C++ 코드를 작성하였다.

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int t;
    cin >> t;

    while (t--) {
        long long x, y;
        cin >> x >> y;
        long long d = y - x;
        long long n = sqrt(d);

        if (d == n * n) {
            cout << 2 * n - 1 << endl;
        } else if (n * n < d && d <= n * n + n) {
            cout << 2 * n << endl;
        } else {
            cout << 2 * n + 1 << endl;
        }
    }

    return 0;
}

코드 설명

  1. 거리 계산: 각 테스트 케이스에 대해 목표 위치와 현재 위치의 거리를 계산한다.
  2. 최소 이동 횟수 계산: 주어진 거리 (d)에 대해 최소 이동 횟수를 계산한다. 이때, 거리의 제곱근을 기준으로 3가지 경우로 나누어 결과를 구한다.
    • (d = n^2) 일 경우: 2n - 1번 이동
    • (n^2 < d \leq n^2 + n) 일 경우: 2n번 이동
    • (n^2 + n < d < (n+1)^2) 일 경우: 2n + 1번 이동

결론

이 문제는 수학적 패턴을 분석하는 과정이 중요하다. 각 테스트 케이스에서 목표 위치에 도달하기 위한 최소한의 이동 횟수를 구하기 위해 제곱근과 그 범위에 따른 계산이 핵심이다. 위의 알고리즘을 사용하면 효율적으로 문제를 해결할 수 있다.

반응형

'BOJ' 카테고리의 다른 글

[코드트리] 메이즈 러너 - c++  (1) 2024.10.13
[코드트리] 마법의 숲 탐색  (3) 2024.09.15
[BOJ 2011] 암호코드  (0) 2024.04.21
[BOJ 2531] 회전 초밥  (0) 2024.03.08
[BOJ 2146] 다리 만들기  (0) 2024.01.26
반응형

형변환

명시적 형변환

int i = 300;
byte b = (byte) i; // 값 손실 발생

묵시적 형변환

byte b = 10;
int i = b; // 값 손실 없음

배열 선언

1차원 배열

int points[] = new int[3];

2차원 배열

int[][] intArray = new int[4][];

문자열을 문자 배열로 변환

String a = new String("123");
char[] charArray = a.toCharArray();

UML

  • private: 빨간색
  • protected: 노란색
  • public: 녹색
  • default: 파란색

객체지향 프로그래밍

특징

  1. 추상화
  2. 다형성
  3. 상속
  4. 데이터 은닉과 보호

객체와 클래스

  • 객체: 클래스를 데이터 타입으로 메모리에 생성되어 실제로 동작하는 것
  • 클래스: 객체를 정의해 놓은 것

생성자

Person person = new Person();
Person person = new Person("name");

this 키워드

  • 객체 자신을 가리킴
  • 로컬 변수와 멤버 변수를 구분할 때 사용
public Person(String name) {
    this.name = name;
}

public Person() {
    this("name");
}

상속

public class Child extends Parents

단일 상속

  • 자바는 단일 상속만 지원 (다이아몬드 상속 문제 방지)

오버라이딩

public class Person {
    void kick() {
        // 차다.
    }
}

public class Player extends Person {
    @Override
    void kick() {
        // 공을 차다
    }
}

조건

  • 메서드 이름, 매개변수, 리턴 타입 동일
  • 접근 제한자는 부모와 같거나 더 넓어야 함
  • 부모보다 더 큰 예외는 던질 수 없음

접근 제한자

  1. public: 모든 클래스에서 접근 가능
  2. protected: 동일 패키지 또는 상속 관계의 클래스에서 접근 가능
  3. private: 동일 클래스 내에서만 접근 가능 (캡슐화)
  4. default: 동일 패키지 내의 클래스에서만 접근 가능

Singleton 패턴

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

다형성

  • 하나의 객체가 여러 형태를 가질 수 있는 성질
public void println(Object o) {}
public void println(Person p) {}

제네릭

정의

  • 다양한 타입의 객체를 다루는 메서드, 컬렉션 클래스에서 컴파일 시 타입 체크
public interface Interface_name<T> {}

형인자

  • T: 타입
  • E: 요소
  • K: 키
  • V: 값

주의할 점

  1. 프라이미티브 타입 사용 불가
  2. 타입 캐스팅 시 런타임에 타입 정보 유지되지 않음
  3. 정적 컨텍스트에서 제네릭 사용 불가
  4. 제네릭 배열 생성 불가
  5. 제네릭 타입 인스턴스 생성 불가

자바의 와일드카드 자료형

와일드카드(Wildcard): 불특정 타입을 나타내기 위해 사용 (?)

  1. 무제한 와일드카드 (?): 어떤 타입이라도 허용
  2. 상한 경계 와일드카드 (? extends T): 특정 타입이나 그 하위 타입을 허용 (읽기 전용)
  3. 하한 경계 와일드카드 (? super T): 특정 타입이나 그 상위 타입을 허용 (쓰기 전용)

Collection 프레임워크

컬렉션(Collection): 여러 개의 객체를 모아서 관리하는 자바의 프레임워크

주요 인터페이스

  1. Collection: 컬렉션의 기본 인터페이스
  2. List: 순서가 있는 컬렉션, 중복 허용 (ArrayList, LinkedList)
  3. Set: 순서가 없는 컬렉션, 중복 불가 (HashSet, TreeSet)
  4. Queue: FIFO 방식의 컬렉션 (LinkedList, PriorityQueue)
  5. Map<K, V>: 키-값 쌍으로 이루어진 컬렉션 (HashMap, TreeMap)

주요 구현 클래스

  1. ArrayList: 가변 크기 배열, 빠른 인덱스 접근
  2. LinkedList: 이중 연결 리스트, 빠른 삽입/삭제
  3. HashSet: 해시 테이블, 중복 불가
  4. TreeSet: 이진 검색 트리, 정렬된 순서 유지
  5. HashMap: 해시 테이블, 키 중복 불가, 값 중복 가능

정렬 (Sort)

자바에서 배열이나 컬렉션을 정렬하는 방법

1. 배열 정렬

Arrays.sort() 메서드

  • 기본형 배열 정렬
    int[] numbers = {5, 3, 8, 1, 2};
    Arrays.sort(numbers);
  • 객체 배열 정렬
    String[] names = {"John", "Alice", "Bob"};
    Arrays.sort(names);
  • Comparator를 사용한 정렬
    Arrays.sort(names, (s1, s2) -> s2.compareTo(s1));

2. 컬렉션 정렬

Collections.sort() 메서드

  • List 정렬
  • List<Integer> numberList = Arrays.asList(5, 3, 8, 1, 2); Collections.sort(numberList);
  • 객체 List 정렬 (Comparable 사용)
  • public class Person implements Comparable<Person> { private String name; private int age; @Override public int compareTo(Person other) { return this.age - other.age; } } List<Person> people = Arrays.asList(new Person("John", 25), new Person("Alice", 30)); Collections.sort(people);
  • Comparator를 사용한 정렬
  • Collections.sort(people, (p1, p2) -> p1.name.compareTo(p2.name));

3. 스트림을 사용한 정렬 (Java 8 이상)

  • 기본 정렬
  • List<Integer> numberList = Arrays.asList(5, 3, 8, 1, 2); List<Integer> sortedList = numberList.stream().sorted().collect(Collectors.toList());
  • Comparator를 사용한 정렬
  • List<Person> sortedPeople = people.stream() .sorted(Comparator.comparing(Person::getName)) .collect(Collectors.toList());

람다 표현식 (Lambda Expressions)

람다 표현식: 익명 함수를 간결하게 표현하는 방법

문법

(parameters) -> expression
(parameters) -> { statements; }

람다식 정렬

List<String> list = Arrays.asList("B", "A", "C");
Collections.sort(list, (s1, s2) -> s1.compareTo(s2));

List<Person> people = Arrays.asList(new Person("John"), new Person("Alice"));
Collections.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName()));

스트림 (Stream)

스트림(Stream): 컬렉션을 처리하는 함수형 프로그래밍 API

주요 특징

  • 연속된 요소: 컬렉션의 요소를 하나씩 처리
  • 함수형 스타일: 선언적이고 함수형 프로그래밍 스타일
  • 지연 연산: 최종 연산 시에만 중간 연산 수행
  • 무상태 연산: 각 요소를 독립적으로 처리

스트림 원리

  • 파이프라인: 소스 -> 중간 연산 -> 최종 연산
  • 중간 연산: 지연 연산, 최종 연산 시 수행

스트림 연산 예시

  • 스트림 생성
  • List<String> names = Arrays.asList("John", "Alice", "Bob"); Stream<String> stream = names.stream();
  • 중간 연산 (필터링, 변환, 정렬)
  • List<String> filteredNames = names.stream() .filter(name -> name.startsWith("A")) .collect(Collectors.toList());
  • 최종 연산 (반복, 집계)
  • names.stream().forEach(name -> System.out.println(name));
    long count = names.stream().filter(name -> name.startsWith("A")).count();
---

### 예외처리 (Exception Handling)

**예외처리**: 예외 상황을 처리하여 프로그램의 비정상 종료를 방지

### 주요 개념과 키워드

1. **try 블록**
   - 예외가 발생할 가능성이 있는 코드 포함
   ```java
   try {
       // 예외 발생 가능 코드
   }
  1. catch 블록
    • 예외가 발생하면 처리
      try {
        // 예외 발생 가능 코드
      } catch (ExceptionType e) {
        // 예외 처리 코드
      }
  2. finally 블록
    • 예외 발생 여부와 관계없이 항상 실행
      try {
        // 예외 발생 가능 코드
      } catch (ExceptionType e) {
        // 예외 처리 코드
      } finally {
        // 항상 실행되는 코드
      }
  3. throw 키워드
    • 명시적으로 예외 발생
      throw new ExceptionType("예외 메시지");
  4. throws 키워드
    • 메서드가 특정 예외를 던질 수 있음을 선언
      public void myMethod() throws ExceptionType {
        // 예외 발생 가능 코드
      }

예외 계층 구조

  • Checked Exception: 컴파일 시점에서 반드시 처리해야 하는 예외 (IOException, SQLException)
  • Unchecked Exception: 런타임 시점에서 발생하는 예외 (NullPointerException, ArrayIndexOutOfBoundsException)

파일 입출력 (File I/O)

파일 입출력: 파일을 읽고 쓰는 작업

주요 클래스 및 인터페이스

  1. java.io 패키지
    • File: 파일 및 디렉토리 경로명 표현
    • FileReader: 파일을 문자 스트림으로 읽음
    • FileWriter: 파일을 문자 스트림으로 씀
    • BufferedReader: 문자 입력 스트림을 버퍼링하여 효율적으로 읽음
    • BufferedWriter: 문자 출력 스트림을 버퍼링하여 효율적으로 씀
    • FileInputStream: 파일을 바이트 스트림으로 읽음
    • FileOutputStream: 파일을 바이트 스트림으로 씀

기본적인 파일 읽기 및 쓰기 예제

문자 스트림

  • 파일 쓰기 (FileWriter)
  • try (FileWriter writer = new FileWriter("example.txt")) { writer.write("Hello, world!"); } catch (IOException e) { e.printStackTrace(); }
  • 파일 읽기 (FileReader)
  • try (FileReader reader = new FileReader("example.txt")) { int data; while ((data = reader.read()) != -1) { System.out.print((char) data); } } catch (IOException e) { e.printStackTrace(); }

바이트 스트림

  • 파일 쓰기 (FileOutputStream)
  • try (FileOutputStream output = new FileOutputStream("example.bin")) { output.write("Hello, world!".getBytes()); } catch (IOException e) { e.printStackTrace(); }
  • 파일 읽기 (FileInputStream)
  • try (FileInputStream input = new FileInputStream("example.bin")) { int data; while ((data = input.read()) != -1) { System.out.print((char) data); } } catch (IOException e) { e.printStackTrace(); }

컴파일 에러

int i;
System.out.println(i); // 초기화 안한 컴파일 오류

런타임 에러

String s = null;
System.out.println(s.length()); // NullPointerException

Teacher t = (Teacher) person; // ClassCastException

Call By Value

String s = new String("hello");
s.concat("world");
System.out.println(s); // hello

s = s.concat("world");
System.out.println(s); // helloworld

인터페이스 VS 추상클래스

  인터페이스 추상클래스
공통점 추상화: 구체적인 구현 없이 메서드 선언만 포함 가능
다형성 지원: 여러 클래스가 공통된 인터페이스나 추상 클래스를 구현함으로써 동일한 타입으로 다룰 수 있음
상속 가능
차이점 구현된 메서드 포함 가능, 필드 가질 수 있음, 생성자 포함 구현 포함 안함 (default 메서드는 예외), 필드 가질 수 없음
단일 상속 다중 상속
extends implements
공통된 기능을 공유하면서 일부 메서드의 구체적인 구현을 제공하기 위해 사용 클래스 간의 계약을 정의하고, 클래스가 반드시 구현해야 하는 메서드를 명시하기 위해 사용

List vs Set vs Map

List

  • 입력 순서가 있는 데이터의 집합
  • 순서가 있으므로 데이터 중복 허용
  • 구현 클래스: ArrayList, LinkedList

Set

  • 입력 순서를 유지하지 않는 데이터의 집합
  • 순서가 없으므로 데이터를 구별할 수 없음
  • 중복 불가
  • 구현 클래스: HashSet, TreeSet

Map

  • Key, Value의 쌍으로 데이터를 관리하는 집합
  • 순서는 없고 Key의 중복 불가, Value 중복 가능
  • 구현 클래스: HashMap, TreeMap
반응형

+ Recent posts