2023.05.10.WED

ronglong·2023년 5월 10일
0

[ 프로그래머스 ]

  • 최솟값 만들기
    : 정답률 76%.
import java.util.*;

class Solution
{
    public int solution(int []A, int []B)
    {
        //큰 수와 작은 수를 곱하였을 때 최솟값
        Arrays.sort(A);
        Arrays.sort(B);

        int answer = 0;

        for(int i=0; i<A.length; i++){
            answer += A[i]*B[B.length-1-i];
        }

        return answer;
    }
}

[ 백준 ]

  • 2164번 카드2
    : 처음에 stack 써야하나 싶다가, 카드를 다시 맨 끝에 넣어야해서 큐를 사용했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //선언

        //입력값 받기
        int num = Integer.parseInt(br.readLine());

        //1~num까지의 숫자를 넣는다.
        Queue<Integer> queue = new LinkedList<>();
        for(int i=1; i<=num; i++){
            queue.add(i);
        }

        while(queue.size()>1){
            //맨 위의 카드를 버린다.
            queue.poll();
            //버린 후 남은 맨 위의 카드를 맨 밑으로 내린다.
            int n = queue.poll();
            queue.add(n);
        }

        //마지막 1장을 출력한다.
        System.out.println(queue.poll());
    }
}
  • 11286번 절댓값 힙
    : 처음에 리스트로 한땀한땀 풀었다가 시간 초과로 통과 못 했다. 정렬해주는 큐가 있으면 좋겠다고 생각했는데, 풀이보니까 실제로 PriorityQueue 타입의 자료구조가 있다. 원하는 정렬 기준으로 선언하는 방법을 다음에 안 까먹을 자신은 없지만,, 그래도 한 번 해봤으니까 다음에는 할 수 있을지도.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //선언

        //입력값 받기
        int num = Integer.parseInt(br.readLine());

        PriorityQueue<Integer> queue = new PriorityQueue<>(
                (o1, o2) -> {
                    int first = Math.abs(o1);
                    int second = Math.abs(o2);
                    //절댓값이 같은 경우 음수 우선 정렬
                    if(first==second) return o1 > o2? 1 : -1;
                    //절댓값 기준 정렬
                    else return first-second;
                }
        );

        //정답 리스트 만들기
        List<Integer> answer = new ArrayList<>();

        for(int i=0; i<num; i++){
            int x = Integer.parseInt(br.readLine());
            //빈 배열인데 정수 x가 0이면, 0을 출력한다.
            if(x==0 && queue.isEmpty()) answer.add(0);
            //주어진 정수 x가 0이면, 배열에서 절댓값이 가장 작은 수를 출력하고 배열에서 제거한다.
            if(x==0 && !queue.isEmpty()) answer.add(queue.poll());
            //주어진 정수 x가 0이 아니면, x를 배열에 추가한다.
            if(x!=0) queue.add(x);
        }

        for(Integer a : answer){
            System.out.println(a);
        }
    }
}

[ 혼공컴운 ]

Chapter 10. 프로세스와 스레드

  • 프로세스 : 실행 중인 프로그램 (포그라운드 프로세스, 백그라운드 프로세스)
  • 데몬(서비스) : 사용자와 상호작용하지 않는 백그라운드 프로세스
  • PCB(Process Control Block, 프로세스 제어 블록)
    • 프로세스 정보를 저장하는 자료구조. 옷의 태그 역할.
    • PID(프로세스 아이디), 프로세스 상태, CPU 스케줄링 정보 등 저장
    • 커널 영역에 생성됨.
  • 문맥 교환(Context Switching)
    • 기존 프로세스의 문맥을 PCB에 저장하고, 새로운 프로세스의 문맥을 PCB로부터 복구하여 실행.
    • 자주하면 오버헤드(시간 비용) 발생
  • 프로세스의 메모리 영역
    • 커널 영역 : PCB
    • 사용자 영역
      • 정적 할당 영역 : 코드 영역, 데이터 영역
      • 동적 할당 영역 : 힙 영역(사용 후 반환 안 하면 메모리 누수 발생), 스택 영역
  • 프로세스 상태 : 생성, 준비, 실행, 대기(입출력 대기), 종료
  • 프로세스 계층 구조 : 부모 프로세스, 자식 프로세스
  • 프로세스 생성 : fork(자기 복제 시스템 콜), exec(메모리 새롭게 덮어쓰기)
  • 스레드 : 프로세스를 구성하는 실행 흐름 단위
  • 프로세스는 기본적으로 자원(코드, 데이터, 힙, 파일) 공유X, 스레드는 같은 프로세스 내의 자원 공유O
  • 프로세스 간 통신(IPC, Inter-Process Communication) : 공유 메모리, 파일 등 이용

Chapter 11. CPU 스케줄링

  • CPU 스케줄링 : CPU 자원 배분
  • 프로세스 우선순위 in PCB
  • 스케줄링 큐(준비 큐, 대기 큐) : 프로세스 줄 세우기
  • 선점형 스케줄링
    • 운영체제가 CPU 빼앗아서 재배분 가능
    • 문맥 교환 발생 비교적 많아, 오버헤드 발생 가능
    • ex. 라운드 로빈 스케줄링(타임 슬라이스), 최소 잔여 시간 우선 스케줄링(SRT)
  • 비선점형 스케줄링
    • 프로세스 끼어들기 불가능
    • ex. 선입 선처리 스케줄링(호위 효과), 최단 작업 우선 스케줄링(SJF)
  • 우선순위 스케줄링(기아 현상 발생 가능, 에이징으로 방지)
    -> 다단계 큐 스케줄링
    -> 다단계 피드백 큐 스케줄링(프로세스가 큐 사이 이동 가능, 에이징 기법 적용, 보편적인 CPU 스케줄링 알고리즘)

[ 느낀 점 ]

오후에 OOP 강의를 1시간 정도 들었다.

  • 생각해볼 것
    -> 접근제어자를 잘 알고 적절하게 제대로 쓰고 있는지(For 캡슐화, 은닉화)
    -> OOP를 잘 써서 사이드 이펙트가 적은지 보려면 클래스 하나 날려보기. 영향 범위 확인.
    -> 프레임워크(OOP 최적 툴)를 잘 사용하고 있는지
    -> Vi 텍스트 에디터 사용해보기

시간이 너무 빠르다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN