본문 바로가기

교육 및 책23

[구름톤 챌린지] 통신망 분석 풀이 과정 먼저, 이 문제를 풀 때 컴포넌트에 포함된 컴퓨터의 번호를 오름차순으로 공백을 두고 출력하라는 것을 보고, TreeSet 자료구조를 이용하면 좋지 않을까 생각했다. 그래서 나는 컴포넌트들을 TreeSet에 담아두고 밀도들을 비교해서 조건에 맞는 TreeSet을 업데이트하는 방식으로 문제를 풀었다. Static 변수 static ArrayList[] A; // 노드와 연결된 노드들의 정보를 담기 위한 배열 static TreeSet treeSet; // 나중에 가장 조건에 적합한 컴포넌트 static boolean visited[]; // 방문한 적이 있는지 확인하는 배열 static int indegree[]; // 아래에서 설명 static int totalOrigin = 0; // 컴포넌트.. 2023. 9. 6.
[구름톤 챌린지] 연합 풀이 과정 처음에는 입력값도 크고 그래서 잠시 유니온파인드인가? 라는 착각을 했었다.. 근데 그러한 문제는 아닌거 같고 그냥 DFS로 풀어보기로 했다. 여기서 핵심은 임의의 두 섬 a와 b에 대해, a번 섬에서 b번 섬으로 직접 이동할 수 있는 다리와 b번 섬에서 a번 섬으로 직접 이동하 룻 있으면, 두 섬은 연합을 결성하는 것이다. 그리고 주의해야할 점으로 a와 b가 연합을 결성하고 b와 c가 여합을 결성했다면 a와 c 역시 위 조건을 만족하지 않더라도 같은 연합에 속해있다고 보는 것이다. 따라서 예제 2번에서 1이 출력되는 것이다. static int count = 0; static boolean visited[]; static ArrayList[] graph; 먼저, static 필드로는 count.. 2023. 9. 4.
[구름톤 챌린지] 작은 노드 풀이 과정 먼저 노드들의 연결 정보를 담기 위해서 ArrayList[] graph를 선언하였다. 그리고 노드 개수만큼 반복하여 해당 인덱스마다 해당 노드가 연결된 정보를 담을 수 있게 new ArrayList();를 통해 할당하였다. 그리고 visited를 통해서는 해당 노드를 방문했을 경우 다음 노드를 방문할 수 있는 용도로 정의하였다. 그 후에 간선의 개수만큼 순회하며 입력된 간선의 정보를 통해 양 노드가 서로 연결되어 있기 때문에 양 노드 모두 해당 인덱스에 대한 ArrayList에 추가하도록 작성했다. 문제 조건 중에 방문할 수 있으면서 번호가 가장 작은 노드로 이동하기 때문에 해당 노드에 연결된 노드들을 오름차순으로 정렬했다. DFS 방식을 사용하여 시작 노드로부터 연결된 노드들을 순회하면 위에.. 2023. 9. 1.
[구름톤 챌린지] 통증 (2) 풀이 과정 먼저, 이 문제는 Dynamic Programming으로 해결할 수 있다. 예를 들어, 3, 4, 5 힐 아이템이 있다고 가정하고, 9라는 통증을 0으로 만들어야하는 상황을 가정해보자. 그 때, 3원의 동전으로 통증 3을 해결하는 방법은 1가지이고, 통증 6을 해결하는 방법은 통증 (6 - 3)을 해결하는 경우의 수 + 1 즉, 2가 된다. 그리고 마지막 통증 9를 해결하기 위해서는 통증 (9 - 3)을 해결하는 방법 + 1이 된다. 다시 4원과 5원을 봤을때 통증 4를 해결하는 방법, 통증 5를 해결하는 방법은 각각 1가지가 되고, 통증 9를 해결하는 방법은 통증 (9 - 4)를 해결하는 방법 + 1(본인) 즉, 2가지가 필요하다. 따라서 정답은 2가 된다. 이를 순서대로 다시 작성해보자. .. 2023. 8. 31.
프로세스 스케줄 프로세스 스케줄러 리눅스 커널에는 프로세스 스케줄러(Process Scheduler, 줄여서 스케줄러) 기능이 있는데 이 기능은 여러 개의 프로세스를 동시에 동작시키는 것처럼 보이게 한다. 이러한 스케줄러의 동작 방식은 다음과 같다. 하나의 CPU는 동시에 하나의 프로세스만 처리할 수 있다. 하나의 CPU에 여러 개의 프로세스를 실행해야 할 때는 각 프로세스를 적절한 시간으로 쪼개서(타임 슬라이스) 번갈아 처리한다. 프로세스 스케줄러 확인을 위한 테스트 프로그램 구현 테스트 프로그램 코드 더보기 // 필요한 헤더파일 및 상수 정의 #include #include #include #include #include #include #include #include #define NLOOP_FOR_ESTIMATI.. 2023. 8. 22.
프로세스 관리 프로세스 생성의 목적 리눅스에서는 두 가지 목적으로 프로세스를 생성한다. 목적 1: 같은 프로그램의 처리를 여러 개의 프로세스가 나눠서 처리한다. 예를 들어, 웹 서버처럼 요청이 여러 개 들어왔을 때 동시에 처리해야 하는 경우 목적 2: 전혀 다른 프로그램을 생성한다. 예를 들어, bash로부터 각종 프로그램을 새로 생성하는 경우 위의 생성 목적에 fork()와 execve() 함수를 사용한다(시스템 내부에서는 clone()과 execve() 시스템 콜을 호출한다.) fork() 함수 위 목적1에는 fork() 함수만을 사용한다. fork() 함수를 실행하면 실행한 프로세스와 함께 새로운 프로세스가 1개 생성된다. 생성 전의 프로세스를 부모 프로세스(parent process), 새롭게 생성된 프로세스를.. 2023. 8. 4.
사용자 모드로 구현되는 기능(시스템 콜) 시스템 콜 프로세스는 프로세스의 생성이나 하드웨어의 조작 등 커널의 도움이 필요한 경우 시스템 콜을 통해 커널에 처리를 요청한다. 시스템 콜의 종류는 다음과 같다. 프로세스 생성, 삭제 메모리 확보, 해제 프로세스 간 통신(IPC) 네트워크 파일시스템 다루기 파일 다루기(디바이스 접근) CPU의 모드 변경 시스템 콜은 CPU의 특수한 명령을 실행해야만 호출된다. 프로세스는 보통 사용자 모드로 실행되고 있지만 커널에 처리를 요청하기 위해 시스템 콜을 호출하면 CPU에서는 인터럽트(interrupt) 이벤트가 발생해 CPU는 사용자 모드에서 커널 모드로 변경되어 커널은 요청한 내용을 처리한다. 요청한 내용 처리가 끝나면 커널 내의 시스템 콜 처리가 종료되어 다시 사용자 모드로 전환되어 프로세스의 동작을 계속.. 2023. 8. 3.
TDD, 클린 코드 - 사다리 미션 3단계 - 사다리 GitHub - oneny/java-ladder: 사다리 타기 구현을 위한 저장소 사다리 타기 구현을 위한 저장소. Contribute to oneny/java-ladder development by creating an account on GitHub. github.com 기능 정리 User 5글자 이하인 name을 가진다. Users , 를 구분자로 사람 이름을 구분한다. 유저수를 반환한다. 유저목록을 반환한다. 위치에 해당하는 유저를 반환한다. 유저의 위치를 변경한다. Position 다음 포지션으로 이동 시 현재 포지션에서 +1을 한다. 이전 포지션으로 이동 시 현재 포지션에서 -1을 한다. 현재 포지션을 반환한다. Direction 첫 포인트에 대한 left는 false인.. 2023. 5. 18.
TDD, 클린 코드 - 로또 미션 2단계 - 로또 GitHub - oneny/java-lotto: 로또 게임 구현을 관리하는 저장소 로또 게임 구현을 관리하는 저장소. Contribute to oneny/java-lotto development by creating an account on GitHub. github.com 기능 목록 핵심 기능 로또 번호는 1 이상 45 이하 로또 티켓은 6개의 로또 번호를 가진다. 당첨 로또티켓과 비교하여 맞춘 개수에 따른 로또 순위들을 반환한다. 로또 순위들을 통해 수익률, 순위 당 몇 개씩 맞췄는지를 출력한다. LottoNumber 1 이상 45 이하의 숫자 그 외의 숫자가 입력되는 경우에는 IllegalArgumentException throw 정적 팩토리 메서드, 인스턴스 캐싱을 통해 같은.. 2023. 5. 14.