안녕하세요 이번 문제는

문제

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

예제 입력 1 복사

5 20 10 35 30 7

예제 출력 1 복사

7 35

 

#include <iostream>

using namespace std;


int main()
{
      int a;
    cin >> a;
    int score[a+1];
    int max = -1000000;
    int min = 1000000;
  

    for(int i=0; i<a; i++)
    {
        cin >> score[i];
    
        if(max < score[i])
     {       max = score[i];}
        if(min > score[i])
         {   min = score[i];
    }
    }
    cout << min <<' '<< max;
    
    return 0;
    
    
}

cin >> a에서 5번 적고

 

for문에서 20 , 10 , 35 , 30  7을 입력합니다.

 

그런 다음 만약 max값보다 score[i]가 크면 max 값으로 저장해놓고

만약 min값도나 socre[i]이 작으면 min값에 저장해놓습니다.

 

딱히 어려운 점은 없는 것 같습니다.

 

이상 포스터를 마치겠습니다.

 

'C&C++' 카테고리의 다른 글

백준 1110번 c++ 문제풀이  (0) 2020.04.05
C++ , 자바(Java) 입출력  (0) 2020.04.05
블록과 블록체인  (0) 2020.03.12
머클 트리(Merkle tree)  (0) 2020.03.12
유닉스/리눅스의 구성요소  (0) 2020.03.12

문제

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수의 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

 

26부터 시작한다. 2+ 6 = 8이다. 새로운 수는 68이다. 6 + 8 = 14이다. 새로운 수는 84이다. 8 + 4 = 12 이다. 새로운 수는 42이다. 4 + 2 6이다. 새로운 수는 26이다.

 

위의 예는 4번만에 원래 수로 돌아올 수 잇다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

출력

첫째 줄에 N의 사이클 길이를 출력한다.

예제 입력 1

26

예제 출력 1 

4

 

예제 입력 2 

55

예제 출력 2 

3

예제 입력 3 

1

예제 출력 3 

60

 

#include <iostream>


using namespace std;


int main()
{
    int n, temp;
    int count = 0;
    cin >> n; // 26 
    temp = n;
    int front, back;

if(n < 0 || n > 99) 
{
    return 0;
}
    while(1)
    {
        front = n / 10; // 2 
        back = n % 10; // 6 

        n = back * 10 + ((front+back) % 10); // 60 + 2 + 6  = 68 
        count ++; // 1 
        if(n == temp) 
        {
            cout<<count<<endl;
            break;
        }
    }
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

return 0;
}

 

부가적인 설명이 필요하지 않을 것 같아서 그렇게 글을 올립니다 ~

 

이상포스터를 마치겠습니다.

'C&C++' 카테고리의 다른 글

백준 10818번 최소,최대 문제 풀이  (0) 2020.04.05
C++ , 자바(Java) 입출력  (0) 2020.04.05
블록과 블록체인  (0) 2020.03.12
머클 트리(Merkle tree)  (0) 2020.03.12
유닉스/리눅스의 구성요소  (0) 2020.03.12

c++

  • c++의 경우에는 scanf/printf, cin/cout을 사용할 수 있다.

  • cin/cout은 scanf/printf보다 느리기 때문에, 입/출력이 많은 문제의 경우에는 scanf/printf를 사용하는 것이 좋다.

  • cin/cout경우 아래 세 줄을 추가하면 scanf/printf만큼 빨라진다.

   ios_base::sync_with_stdio(false);

cin.tie(NULL);  or cin.tiec(nullptr)

위에 두개만 작성해도 충분하다.

cout.tie(NULL);

이 경우에는 cin/cout와 scanf/printf을 섞어 쓰면 안된다. 즉, cin/cout만 써야 한다.

 

출력속도 비교는 c++(cout, '\n'사용) : 0.827초를 쓰는 게 좋다. 즉, endl<\n이 더 좋다.

 

java입출력

  • Java는 입력은 Scaner, 출력은 System.out을 사용한다.  = Scanner sc = new Scanner(System.in);

  • 입력이 많은 경우에는 속도가 느리기 때문에, BufferedReader를 사용한다.

  • BufferedReader br = new BufferedReader(new InputStreamReader(Syste.in));

  • 출력이 많은 경우에는 StringBuilder를 사용해서 한 문자열로 만들어서 출력을 한 번만 사용하거나

  • BufferedWriter를 사용한다.

 

 

 

이상포스터를 마치겠습니다.

'C&C++' 카테고리의 다른 글

백준 10818번 최소,최대 문제 풀이  (0) 2020.04.05
백준 1110번 c++ 문제풀이  (0) 2020.04.05
블록과 블록체인  (0) 2020.03.12
머클 트리(Merkle tree)  (0) 2020.03.12
유닉스/리눅스의 구성요소  (0) 2020.03.12

 

1. 블록의 구조와 식별자

블록은 링크 구조를 가지며, 새로 추가된 블록은 이 링크의 끝에 위치하게 된다. 각 블록은 자신의 앞에 위치한 블록(부모 블록)으로 연결되는 링크를 갖고 있고, 이 링크를 거슬러 올라가면 첫 번째 블록인 genesis 블록에 다다를 수 있다.

블록에는 거래나 부모 블록으로 이어지는 링크 같은 정보가 저장되어 있다.

 

[표1. 블록의 구조]

 

필드

필드 크기(바이트)

설명

Block Size

4

다음 필드부터 블록 끝가지 데이터 크기(바이트)

Block Header

80

블록 헤더 정보

Transaction Counter

1~9

블록에 포함된 거래의 수

Transaction

가변적

거래의 목록

[표2. 블록 헤더의 구조]

 

필드

필드 크기(바이트)

설명

Version

4

소프트웨어 혹은 프로토콜 버전 정보

Previous Block Hash

32

부모 블록의 해시값

Merkle Root

32

머클 트리 루트의 해시값

Timestamp

4

블록을 생성한 시간(Unixtime)

Difficulty Target

4

블록을 생성할 때 PoW의 난이도

Nonce

4

PoW에서 사용하는 카운터

블록체인 안에서 어떤 블록을 특정하려면 블록 해시와 블록 높이라는 값을 사용하는데, 이들 값을 블록 식별자라고 한다.

 

블록 해시는 블록 헤더를 SHA-256 알고리즘으로 2번 연속 해싱한 값으로, 모든 블록이 서로 다른 값을 갖는다. 블록 해시는 필요에 따라 노드가 계산하며 블록 내에 직접 저장되지는 않는다.

 

genesis 블록의 블록 높이는 0이고 그 뒤로 블록이 덧붙을 때마다 1씩 증가한다. 블록 해시는 특정 블록을 식별할 수 있는 유일 식별자인 데 비해 블록을 특정할 수 없는 경우도 있다.

 

블록에는 부모 블록으로 이어지는 링크가 있다. 하나 이상의 자식 블록을 갖는 경우도 있다.

 

 

2. 블록 안의 거래 검색하기

블록체인 네트워크에 참여하는 노드라고 해도 과거 모든 블록을 저장하지 않는다. 스마트폰이나 태블릿 같은 노드에는 저장 용량이 부족하여 모든 블록을 저장할 수 없다.

이러한 이유를 방지하기 위한 SPV(블록 헤더만 저장하는)가 있다. 과거의 모든 블록으로 구성된 블록체인을 풀블록체인이라 부르는데, 블록헤더만 저장하면 풀블록체인에 비해 1/1000 정도로 크키가 줄어들기 때문에 필요한 저장 용량도 대폭 줄어든다.

 

SPV노드에서 특정한 거래가 블록에 포함되어 있는지 확인하려면 어떻게 해야 할까?

-> 머클트리(Merkle tree)라는 것을 사용한다.

머클트리는 다음장으로 ^___^

 

이상 포스터를 마치겠습니다.

 

머클 트리는 대규모 데이터를 효율적으로 요약하고 검증하는 이진 트리 기반의 데이터 구조로, 블록 안에 저장된 거래 모두에 대해 디지털 지문을 만들어서 어떤 거래가 블록에 저장되어 있는지 검색할 수 있도록 해준다.

 

머클 트리를 만드는 방법?

이진 트리에 포함된 잎 노드 쌍을 연결하고, 이에 대한 해시값을 계산(SHA-256 이중 해시)하는 과정을 해시값이 하나가 될 때까지 재귀적으로 반복하면 된다. 이 과정을 거쳐 마지막에 남은 해시값이 블록 헤더의 머클 루트(Merkle Root)이다.

 

먼저 [그림 1]과 같이 각 거래의 해시값을 모은다. 예를 들면 거래 A의 해시값은 HA이다. 그 다음, 인접한 잎 노드의 해시값과 연결된 해시값을 가져와서 새로운 노드를 생성한다. 이런 과정을 반복하며 마지막에 남는 노드가 머클 루트이며 그림에서 HABCD가 된다.

그림 1. 머클 트리를 구축하는 과정

머클 트리는 이진 트리이므로 거래 수가 짝수

만약 거래 수가 홀수라면 거래를 하나 복제하여 짝수로 만들면 된다 .

[그림 1.]에서 거래 Tx D가 없는 경유를 예로 들면 [그림 1]과 같이 거래 D자리를 거래 C로 바꾸는 것과 같다.

 

 

이상포스터를 마치겠습니다.

 

안녕하세요^^ 오늘은 유닉스/리눅스의 구성요소에 대해 알아보겠습니다. 유닉스/리눅스에서 제일 중요한 부분은 커널인데요, 해커들이 주로 공격하는 곳이 커널입니다. 예를 들어서 shell Coding을 통해서 shell 권한 상승 후 exploit을 하거나 BOF(Buffer over Flow)를 통해서 해킹을 합니다. 

 

 

유닉스의 구조

-커널

- 유닉스 운영체제의 핵심입니다. 프로세스 관리 , 메로리 관리, 파일 시스템 관리, 장치 관리 등 컴퓨터의 모든 자원을 초기화하고 제어하는 기능을 수행합니다. 시스템을 최초로 구동할 때 커널은 메모리에 적재되는데, 메모리에 상주하면서 프로세스 스케줄링과 메모리, 디스크 드라이브, 네트워크 인터페이스 등 하드웨어 자원을 모든 사용자에게 할당하고 제어합니다.

-커널은 파일 서브시스템프로세스 제어 서브시스템으로 구성됩니다.

 

파일서브시스템에서는 메모리, 외부장치에 데이터를 전송하거나 블록 단위로 입출력을 실행할 때 메모리의 일부를 버퍼로 할당하고, 이것을 사용자의 주소 공간과 외부장치 사이에 두는 디스크 캐시 방법으로 파일을 관리합니다.

 

 

프로세스 제어 서브시스템에서는 프로세스의 동기화와 프로세스 간 통신, 프로세스 간 메모리 관리, 프로세스 스케줄링과 디스패칭을 담당합니다. (fork, exec, exit, wait, signal 등이 있음)

 

-셸은 사용자와 커널 사이의 중간자 역할을 담당하는 특별한 프로그램이다. 셸을 사용자가 입력을 하게 되면 명령을 해석하여 커널에 넘겨주면 커널이 명령의 수행 결과를 돌려줍니다. 셸은 이것을 다시 사용자가 이해할 수 있는 형태로 바꿔서 출력합니다. ex) C 셸, 콘 셸, 배시 셸, z 셸 등

유틸리티와 파일 시스템 

유닉스는 각종 개발 도구, 문서 편집 도구, 네트워크 관련 도구 등 매우 다양한 유틸리티를 제공합니다. 유틸리티는 사용자에게 편의를 제공하려고 준비한 시스템 프로그램입니다. 유닉스는 계층적으로 구성된 파일 시스템을 사용하여 시스템 파일과 사용자 파일을 체계적으로 관리합니다. 

 

 

이상포스터를 마치겠습니다.

하이퍼레저

하이퍼레저 패브릭(Hyperledger Fabric)이란?


-> 하이퍼레저 패브릭은 허가용 프라이빗 블록체인(Permissioned and Private Blockchain) 형태로 개발되었으며, 이더리움,비트코인 등 누구나 참여할 수 있는 퍼블릭 블록체인(Public Blockchain)과 달리 MSP(Membership Service Provider)라는 인증 관리 시스템에 등록 된 사용자만이 하이퍼레저 패브릭 블록체인에 참여할 수 있습니다.


하이퍼레저 패브릭(Hyperledger Fabric)의 특징


1. 허가 된 사람만 참여가 가능합니다.
2. 일반 프로그래밍 언어 사용(GO, node.js)  
3. 다수의 거래를 병렬적으로 빠르게 처리 가능 
4. 교체 가능한 모듈 구조 (SOLo, Kafka, PBFT) 
5. MSP를 이용하기 때문에 네트워크 참여자의 신원을 확인할 수가 있습니다.
6. 하이퍼레저 패브릭만에 시스템 체인코드 사용

 

이더리움

 

이더리움(Ethereum)이란? 


-> 이더리움(Ethereum) 재단에서 개발한 오픈소스 프로젝트, 블록체인 기술을 구현하기 위한 플랫폼(Smart Contract) 


이더리움(Ethereum)의 특징


1. 비허가용 (누구나 사용 가능) 
2. 내장 프로그래밍 언어 사용 (솔리디티)
3. 다수의 거래를 순차적으로 빠르게 처리 가능
4. 스마트 컨트랙트(Smart Contract) 사용 =  ex) 물물교환을 할 시 서로의 신뢰를 위해 사용(약속)

그래서 무엇을 쓰냐, 


사업용으로 쓰고 싶고 허가 된 사람만 참여가 가능하게 하고 싶다면 == 하이퍼레저 패브릭

익명을 권장하고 화폐를 쓰고 싶고 네트워크를 공개하고 싶다면  자체언어(솔리디티)를 쓰고 싶다면 == 이더리움

 

이상 포스터를 마치겠습니다.

'C&C++' 카테고리의 다른 글

백준 1110번 c++ 문제풀이  (0) 2020.04.05
C++ , 자바(Java) 입출력  (0) 2020.04.05
블록과 블록체인  (0) 2020.03.12
머클 트리(Merkle tree)  (0) 2020.03.12
유닉스/리눅스의 구성요소  (0) 2020.03.12

+ Recent posts