목록분류 전체보기 (114)
승코딩당당당
문제[C++] 백준 15650: N과 M (2) SILVER 3https://www.acmicpc.net/problem/15650 접근 방법1부터 N까지 중에서 M개를 고르는 조합(오름차순) 을 모두 출력하는 문제다.순서가 바뀐 경우는 같은 조합으로 취급하므로(예: 1 2와 2 1은 같은 조합), 항상 작은 수부터 큰 수로만 뽑히도록 백트래킹을 구성하면 된다.이를 위해 start 변수를 사용해, 다음에 뽑을 수 있는 숫자의 시작 범위를 제한했다.현재 i를 뽑았다면 다음 재귀에서는 i+1부터만 고를 수 있게 함그래서 자동으로 중복/역순이 발생하지 않는다 상세 아이디어picked : 현재까지 선택한 숫자들을 담는 벡터depth : 현재까지 몇 개를 뽑았는지(선택 개수)start : 다음에 뽑을 수 있는 최..
문제[C++] 백준 1747: 소수&팰린드롬 SILVER 1https://www.acmicpc.net/problem/1747 접근 방법이 문제는 주어진 수 N 이상에서 가장 작은 소수이면서 팰린드롬(회문)인 수를 찾는 문제다.즉, 두 조건을 동시에 만족해야 한다.소수(Prime Number)앞뒤가 같은 수(팰린드롬)그래서 풀이를 두 단계로 나누었다. 1. 소수 판별 – 에라토스테네스의 체먼저 충분히 큰 범위(약 1003000까지)에 대해에라토스테네스의 체를 이용해 소수 여부를 미리 구해두었다.for (int i = 2; i 소수가 아닌 수는 -1로 표시마지막에 vect[0], vect[1]도 소수가 아니므로 -1 처리이렇게 하면 이후에는 빠르게 소수 여부를 확인할 수 있다. 2. 팰린드롬 검사N부터 시..
이번 실습에서는 라즈베리파이의 GPIO 핀에 연결된 LED를 리눅스 커널 모듈을 통해 직접 제어해보았다. 단순히 사용자 프로그램에서 GPIO 라이브러리를 사용하는 것이 아니라, 커널 공간에서 동작하는 문자 디바이스 드라이버를 직접 작성하고 /dev/gpioled라는 디바이스 파일을 생성하여 사용자 공간과 커널 공간을 연결하는 과정을 경험한다. ./gpio 1 와 같은 명령이 실행되면 사용자 공간에서 write 시스템 콜이 발생하고, 이는 커널 내부의 gpio_write() 함수로 전달된다. 해당 함수에서는 메모리 매핑을 통해 GPIO 레지스터에 직접 접근하여 LED를 켜거나 끄는 동작을 수행한다. 이 과정에서 리눅스의 문자 디바이스 등록 과정(register_chrdev_region, cdev_add)과..
이번 글에서는 디바이스 드라이버의 개념과 구조를 정리하였다.입출력 장치와 버스 구조부터 시작해, I/O 자원 관리 방식(Polling, Interrupt, DMA),Memory-mapped I/O 구조, 그리고 리눅스에서의 디바이스 파일 개념까지 단계적으로 설명하였다. 특히 리눅스 환경에서 디바이스가 파일처럼 관리되는 구조와 Character/Block/Network 디바이스의 차이를 이해하는 것을 목표로 한다. 운영체제와 하드웨어 사이의 연결 고리를 이해하는 데 중요한 기초 개념이다. 입출력 장치(I/O 디바이스)CPU와 정보를 교환하는 장치Digital 신호 또는 non-digital 신호를 포함한다CPU와는 digital 신호를 통해 연결된다 버스 (Bus)버스란?CPU(들), RAM 그리고 개인..
이번 포스팅에서는 리눅스 운영체제에서의 예외처리와 인터럽트 구조, 그리고 커널 내부에서의 인터럽트 처리 방식과 타이머 동작 원리를 정리한다. 예외(Exception)와 인터럽트(Interrupt)의 개념적 차이부터 시작해,인터럽트 벡터, 인터럽트 제어기, 인터럽트 핸들러 구조(Top Half / Bottom Half)까지 단계적으로 살펴본다. 또한 리눅스 커널이 타이머 인터럽트를 통해 수행하는 작업과시스템 콜(System Call)이 사용자 공간과 커널 공간을 연결하는 방식에 대해서도 함께 정리한다. 본 글을 통해 아래 내용을 한 번에 이해하는 것을 목표로 한다.인터럽트 기반 I/O 처리의 흐름커널 내부 처리 구조시스템 콜과 POSIX API의 관계 예외처리와 인터럽트예외처리(Exception)비정상적..
운영체제에서 메모리와 주소(Address)는 프로세스 실행과 자원 관리의 핵심 개념이다. 프로그램은 메모리에 저장되고, CPU는 주소(Address)를 통해 해당 메모리 위치에 접근한다.리눅스에서는 논리 주소, 선형 주소(가상 주소), 물리 주소의 개념을 구분하며,가상 메모리 시스템을 통해 프로세스마다 독립적인 주소 공간을 제공한다. 또한 리눅스는가상 주소 공간(Virtual Address Space)메모리 보호(Memory Protection)메모리 매핑(mmap)Demand PagingCopy On Write(COW)Swapping과 같은 메모리 관리 기법을 통해 제한된 물리 메모리를 효율적으로 사용하도록 설계되어 있다. 본 글에서는 메모리와 주소의 기본 개념부터 리눅스의 가상 메모리 구조, 주소 변..
문제[C++] 백준 14940: 쉬운 최단거리 SILVER 1https://www.acmicpc.net/problem/14940 접근 방법이 문제는 시작점(값이 2인 위치)에서 각 칸까지의 최단 거리를 구하는 문제이다.이동은 상하좌우로 가능하며, 값이 1인 칸만 이동할 수 있고 0은 이동할 수 없다.최단 거리를 구하는 문제이므로 BFS(너비 우선 탐색) 를 사용했다. 핵심 아이디어:시작점(2)의 좌표를 먼저 찾는다.BFS를 이용해 사방 탐색을 진행한다.이동 가능한 칸(값이 1)만 큐에 넣는다.현재 칸의 거리 + 1을 다음 칸의 거리로 저장한다.BFS는 먼저 방문한 경로가 곧 최단 거리이므로 별도의 최단 거리 비교 없이도 정확한 값이 저장된다.결과 배열 ret은 -1로 초기화하여 도달하지 못한 칸을 구분..
문제[C++] 백준 18111: 마인크래프트 SILVER 2https://www.acmicpc.net/problem/18111 접근 방법이 문제는 땅의 모든 칸을 같은 높이 i로 평탄화할 때 걸리는 최소 시간과 그때의 높이를 구하는 문제다. 핵심 아이디어는 다음과 같다.목표 높이 i는 0 ~ 256 전부 후보다.현재 맵에 “i 높이 칸이 0개”라도 그 높이로 평탄화하는 게 최적일 수 있다.각 후보 높이 i에 대해,높이가 더 높은 칸(j > i)은 블록을 제거해야 하고 (1개당 2초)높이가 더 낮은 칸(j 블록을 설치해야 한다 (1개당 1초)제거하면 블록이 인벤토리에 들어오므로, 최종적으로 인벤토리 블록이 음수가 되면 그 높이는 불가능하다.(인벤토리 블록이 음수라는 것은, 갖고 있는 블록보다 오바해서 사..
리눅스는 서버 환경을 비롯해 다양한 시스템에서 널리 사용되는 운영체제로,기본 개념을 정확히 이해하는 것이 이후 시스템 프로그래밍이나 서버 관리 학습의 기초가 된다. 이 글에서는 리눅스의 전반적인 구조를 시작으로 커널과 셸의 역할을 살펴보고,리눅스 파일 시스템의 특징과 파일·디렉터리의 종류, 계층 구조를 정리한다.또한 절대 경로와 상대 경로의 차이, 작업 디렉터리와 홈 디렉터리 개념을 함께 정리하여리눅스 환경에서 파일을 다루는 기본적인 감각을 익히는 것을 목표로 한다. 마지막으로 셸의 기능과 종류를 통해 사용자가 리눅스 시스템과 어떻게 상호작용하는지 이해해본다. 리눅스 기초리눅스의 특징리눅스는 공개 소프트웨어이며 무료로 사용할 수 있다.유닉스와의 완벽한 호환성을 유지한다.서버용 운영체제로 많이 사용된다...
문제[C++] 백준 21736: 헌내기는 친구가 필요해 SILVER 2https://www.acmicpc.net/problem/21736 접근 방법이 문제는 캠퍼스 지도가 주어졌을 때, 도연이(I)가 있는 위치에서 출발하여 벽(X)을 제외한 모든 경로를 탐색하면서 사람(P)의 수를 세는 문제다. 캠퍼스는 2차원 격자 형태이므로, 상·하·좌·우로 이동하면서 탐색하는 그래프 탐색 문제로 볼 수 있고,한 번 방문한 곳을 다시 방문하지 않기 위해 visited 배열을 사용한 DFS(깊이 우선 탐색) 로 해결했다. 풀이 흐름은 다음과 같다.캠퍼스 정보를 2차원 배열에 저장하면서, 도연이의 시작 위치(I)를 찾는다.시작 위치에서 DFS를 시작한다.이동할 수 있는 조건은캠퍼스 범위 안에 있고아직 방문하지 않았으며벽..