본 글은 '이것이 취업을 위한 컴퓨터 과학이다 with CS 기술 면접' 책을 읽고 정리한 글입니다. ✔️ 임계 영역 프로세스 혹은 스레드가 공유하는 자원을 공유 자원이라고 한다. 만약 두 프로세스 A와 B가 각각 공유 메모리를 쓰고 읽는 작업을 한다고 할 때, A와 B가 실행되는 순서에 따라 다른 결과를 초래할 수 있다. B가 먼저 실행이 된다면 아직 쓰이지 않은 메모리를 읽으려 하기 때문에 문제가 발생할 수 있다. 이와 같이 접근 순서에 따라 다른 결과를 나타낼 수 있는 코드 구역을 임계 영역(critical section)이라고 한다. 이번에는 동시에 파일을 수정하는 스레드를 생각해보자. 초기 파일에 저장된 값이 'first'라 가정하고 스레드 A는 'thread A'를 파일에 추가하는 작..
본 글은 '이것이 취업을 위한 컴퓨터 과학이다 with CS 기술 면접' 책을 읽고 정리한 글입니다. 프로세스프로세스는 컴퓨터에서 실행 중인 프로그램을 의미한다. ✔️ 프로세스의 메모리 구조 컴퓨터의 메모리는 RAM, 레지스터와 같이 물리적인 컴퓨터의 구성요소이고, 지금 볼 프로세스의 메모리는 운영체제가 해당 프로세스에 할당한 논리 메모리 구조이다. 프로세스의 메모리 구조는 다음 그림과 같다. 커널 영역에는 프로세스 제어 블록 (PCB)이 저장되고, 사용자 영역에는 코드, 데이터, 힙, 스택 영역으로 나뉘어 저장된다. 코드 영역 코드 영역은 함수, 상수와 같은 기계어가 저장되는 공간으로, 텍스트 영역이라고도 한다.CPU가 읽고 실행할 명령어가 담겨 있기 때문에 읽기 전용 공간이다. 만약 쓰기가 ..
본 글은 '이것이 취업을 위한 컴퓨터 과학이다 with CS 기술 면접' 책을 읽고 정리한 글입니다. 운영체제란?운영체제(OS: Operating System)는 하드웨어 위에 설치되어, 하드웨어 계층과 다른 소프트웨어 계층을 연결하는 소프트웨어 계층이다. 또한, 컴퓨터 자원을 효율적으로 관리하기 위한 시스템으로, 사용자가 컴퓨터를 사용할 수 있는 환경을 제공하는 역할을 한다. 만약 운영체제가 컴퓨터에 탑재되어있지 않다면, 우리가 컴퓨터를 이용해서 사용하는 모든 기본적인 프로그램들을 사용할 수 없을 것이다. `ex. Excel` 대표적인 OS로는 윈도우, 맥OS, 리눅스, 유닉스가 있다. 운영체제의 구조 운영체제는 커널과 인터페이스로 구성되어 있다. 커널 커널은 운영체제의 핵심 요소로, 하드웨어의 ..
정말정말 오랜만에 쓰는 블로그 글!원래는 알고리즘을 Swift로만 하다가 최근에는 파이썬도 하고 있다 문제 링크 https://www.acmicpc.net/problem/1068 문제 접근트리에서 특정 노드를 지웠을 때, 남아있는 트리의 노드 중 리프 노드의 개수를 구하는 문제이다. 트리 문제를 풀 때는 보통 그래프로 접근을 하고, 2차원 배열에 한 노드에 연결된 노드 번호를 모두 저장하는 식으로 구현을 한다. 위의 그림으로 예를 들자면 아래처럼 저장을 한다는 이야기다. [ [1,2], // 0번 노드 [0,3,4], // 1번 노드 [0], // 2번 노드 [1], // 3번 노드 [1] // 4번 노드] 하지만 리프 노드인지에 대한 판단을 어떻게 할 것인가? 라..
iOS의 ThreadiOS의 Thread는 두 종류가 있다. Main Thread와 Global Thread (= Background Thread) Main Thread iOS에서 Main Thread는 사용자와 상호작용하는 모든 것을 처리하는 역할을 한다. 터치 이벤트, 제스처, UI 업데이트 등 UI와 관련된 모든 작업들은 Main Thread에서 처리되어야 한다. 기본으로 작성하는 코드들은 모두 Main Thread에서 동작하게 되고,시간이 걸리는 작업들을 Main Thread에서 실행하게 된다면 실제 앱에서는 버퍼링이 걸린 것처럼 느려지게 될 것이다. 그런 작업들은 Main Thread가 아닌 Global Thread에서 실행하여 백그라운드에서 작업을 처리하도록 하는 것이 좋다. Global..
문제 링크 https://www.acmicpc.net/problem/18185 문제를 맞추고 나서 티어를 보고 굉장히 놀랐던 문제 ,, 문제 접근 문제를 읽었을 때, 전구와 스위치 문제랑 굉장히 비슷하다고 생각해서 비슷한 방법으로 접근하고자 했다. 현재의 위치를 i 라고 한다면, 영향을 줄 수 있는 곳의 위치는 `i`, `i+1`, `i+2` 이다. `i`가 마지막 즈음에 도달했을 때 `i+1`과 `i+2`의 위치를 끝까지 접근하기 위해, 입력 받은 라면 개수의 배열에 0을 두 개 추가해주었다. 만약 라면 개수의 입력이 `1 1 1 0 2`라면 내가 사용하게 될 배열은 `[1, 1, 1, 0, 2, 0, 0]`이 된다. 체크 1현재 위치 `i`에 영향을 줄 수 있는 위치는 자기 자신 `i` 뿐이다...
문제 링크 https://www.acmicpc.net/problem/1253 문제 접근 N 개의 수 중 어떤 수가 다른 두 수의 합이 되는 숫자의 개수를 찾아야 한다. 주의할 점은, 각 수가 가질 수 있는 숫자의 범위가 절댓값 1,000,000,000이라는 것이다. 물론 주어진 수를 하나씩 비교하며 답을 찾을 수 있을 것이다. 그치만 그 방식으로 실행한다면 시간이 엄청 오래 걸릴 것이다.그럼 시간을 줄일 수 있는 방법을 찾아야 한다. 일단 이 문제는 숫자의 순서를 유지할 필요가 없다. 그럼 정렬을 하는 방법을 생각할 수 있다. 오름차순으로 정렬했을 때, 앞에서부터 두 개의 숫자를 더해서 답을 찾고자할 수 있다. 하지만 이 경우에도 최악의 경우 시간복잡도가 O(N^3)이 될 것이다. 두 수를 얻기 위한..
프로그래밍을 공부하면서 '비동기 처리'라는 말을 굉장히 많이 듣게 된다. 그렇다면 비동기란 뭘까 ?? Thread와 Task 동기와 비동기의 개념을 이해하기 위해 스레드와 테스크에 대해 아주 간단히만 설명하자면, 테스크(Task)는 우리가 요청한 작업이고 스레드(Thread)는 테스크를 하는 아이이다. 스레드가 1개라면 작업을 할 수 있는 사람이 한 명이지만 스레드가 여러 개라면 작업을 할 수 있는 사람이 여러 명인 것과 같다. 동시성이 필요한 이유우리가 요청한 작업은 아래 그림과 같이 하나의 스레드에서 순차적으로 작업이 이뤄진다. 요청한 작업을 처리하는데 걸리는 시간이 얼마 걸리지 않는다면 순차적으로 처리해도 문제가 되지 않는다. 만약 작업을 처리하는데 걸리는 시간이 길어진다면 어떨까?? 4번 작..