220103 TIL

Donghun Ha·2022년 1월 3일
1

TIL

목록 보기
4/6

PS(Problem solving) 8문제

문제문제 제목
1259팰린드롬수
2751수 정렬하기 2
4153직각삼각형
10250ACM 호텔
10814나이순 정렬
10816숫자 카드 2
11650좌표 정렬하기
11866요세푸스 문제 0

새로 배운 점

  • 정렬 함수인 sort의 세 번째 인자

    sort 함수를 사용할 때, 일반적으로 sort(arr.begin(), arr.end()); 와 같이만 사용했는데, 세 번째 인자로 bool 형을 반환하는 함수를 주면 해당 함수를 기준으로 정렬된다.

    // 10814 나이 순 정렬
    #include <bits/stdc++.h>
    using namespace std;;
    
    vector<tuple<int, int, string> > v;
    int n, age;
    string name;
    
    bool compare(tuple<int, int, string> a, tuple<int, int, string> b) {
        if (get<1>(a) == get<1>(b))
            return get<0>(a) < get<0>(b);
        return get<1>(a) < get<1>(b);
        // 문제의 조건이 나이 같은 경우, 들어온 순서(인덱스)
        // 아니면, 나이 순 오름차순으로 정렬한다.
    }
    
    int main() {
        ios::sync_with_stdio(0); cin.tie(0);
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> age >> name;
            v.push_back({i, age, name});
    	// 인덱스, 나이, 이름 순으로 넣어준다.
        }
        sort(v.begin(), v.end(), compare);
        // compare 함수 조건에 맞게 정렬된다.
        for (auto i: v) {
            cout << get<1>(i) << ' ' << get<2>(i) << '\n';
        }
    }
  • upper_bound, lower_bound

    upper_bound 함수를 통해 특정 값을 가진 마지막 iterator을 찾을 수 있고,
    lower_bound 함수를 통해 특정 값을 가진 첫 iterator을 찾을 수 있다.

    // 10816 숫자 카드 2
    
    #include <bits/stdc++.h>
    using namespace std;
    
    int n, m, c;
    int b[500001];
    
    int main() {
        ios::sync_with_stdio(0); cin.tie(0);
        cin >> n;
        for (int i = 0; i < n; i++)
            cin >> b[i];
    	// n개 만큼의 숫자 카드를 입력 받아 배열에 넣어준다.
        sort(b, b + n);
        // 배열을 정렬하고,
        cin >> m;
        for (int i = 0; i < m; i++) {
            cin >> c;
    	// 앞에 배열에서, 새로 입력받은 케이스가 몇 개 인지 확인한다.
            auto upper = upper_bound(b, b + n, c);
            auto lower = lower_bound(b, b + n, c);
            cout << upper - lower << ' ';
    	// 정렬된 배열에서 특정 값 마지막 - 처음 = 갯수
        }
    }

Go 동시성

아래 링크에 내용을 정리하였음
[Go] 동시성(Concurrency)

멀티 스레딩, 멀티 태스킹

  • 프로그램: 저장 장치에 저장되어 있지만, 메모리에 올라가지 않고 정적인 상태
  • 프로세스: 운영체제로 부터 자원을 할당받은 작업의 단위
  • 스레드: 프로세스가 할당받은 자원을 사용하는 실행 흐름의 단위

위 개념을 기준으로, 프로그램을 실행시면 파일은 메모리에 올라가게 되고, 동적인 상태가 된다.(이 상태를 프로세스라고 한다. = 실행되고 있는 컴퓨터 프로그램)

스레드는 실행중인 프로그램(프로세스)의 코드에 따라 실행되는 작업 경로다.
스레드는 프로세스 내에서 여러 개로 나뉘기 때문에, 스택을 제외한 메모리를 공유한다.

멀티 스레딩은 한 개의 프로세스가 여러 스레드를 사용하여 작업을 동시에 처리하는 것을 의미하고, 멀티 태스킹은 한 개의 운영체제 안에서 여러 프로세스가 실행되는 것을 뜻한다.

멀티 스레딩의 장점

  • 메모리를 공유하기 때문에, Context-Switching을 효율적으로 할 수 있다.(메모리를 적게 씀)
  • Stack을 제외한 메모리 영역을 공유하기 때문에, 통신 비용이 적고 응답이 빠르다.

멀티 스레딩의 단점

  • 메모리를 공유하기 때문에, 한 개의 스레드에서 문제가 발생하면 모든 프로세스가 종료된다.
  • 메모리를 공유하기 때문에, 동기화 문제가 발생할 수 있다.

멀티 스레딩은 OS에서 다루는 내용으로, OS 강의를 들을 때, 다시 확인해야겠다.

profile
42 Seoul Cadet, dha

0개의 댓글