본문 바로가기
JWT(JSON Web Token)이란? 배경 지식 인증 (Authentication) 인증은 사용자의 신원을 확인하는 프로세스를 의미한다. 사용자가 시스템 또는 서비스에 로그인할 때, 사용자의 아이디와 비밀번호, 생체 인식, 토큰 또는 다른 인증 수단을 통해 사용자가 누구인지 확인하는 것을 뜻한다. 즉, 인증은 “누구”를 확인하는 프로세스라고 생각하면 된다. 인가 (Authorization) 인가는 인증된 사용자가 특정 리소스 또는 기능에 액세스 할 수 있는 권한을 결정하는 프로세스를 의미한다. 사용자가 로그인에 성공하여 시스템에 액세스했을 때, 인가는 해당 사용자에 대한 권한을 관리하고 이 권한을 기반으로 사용자가 특정 리소스에 접근할 수 있는지를 결정한다. 즉, 인가는 “무엇”에 액세스 할 수 있는지를 결정하는 프로세스로, 사용자의 권한을.. 2023. 11. 4.
[알고리즘] 프로그래머스 - 바탕화면 정리 (JS) ✅ 문제 코딩테스트를 준비하는 머쓱이는 프로그래머스에서 문제를 풀고 나중에 다시 코드를 보면서 공부하려고 작성한 코드를 컴퓨터 바탕화면에 아무 위치에나 저장해 둡니다. 저장한 코드가 많아지면서 머쓱이는 본인의 컴퓨터 바탕화면이 너무 지저분하다고 생각했습니다. 프로그래머스에서 작성했던 코드는 그 문제에 가서 다시 볼 수 있기 때문에 저장해 둔 파일들을 전부 삭제하기로 했습니다. 컴퓨터 바탕화면은 각 칸이 정사각형인 격자판입니다. 이때 컴퓨터 바탕화면의 상태를 나타낸 문자열 배열 wallpaper가 주어집니다. 파일들은 바탕화면의 격자칸에 위치하고 바탕화면의 격자점들은 바탕화면의 가장 왼쪽 위를 (0, 0)으로 시작해 (세로 좌표, 가로 좌표)로 표현합니다. 빈칸은 ".", 파일이 있는 칸은 "#"의 값을 .. 2023. 9. 19.
[알고리즘] 프로그래머스 - 미로탈출 (JS) ✅ 문제 1 x 1 크기의 칸들로 이루어진 직사각형 격자 형태의 미로에서 탈출하려고 합니다. 각 칸은 통로 또는 벽으로 구성되어 있으며, 벽으로 된 칸은 지나갈 수 없고 통로로 된 칸으로만 이동할 수 있습니다. 통로들 중 한 칸에는 미로를 빠져나가는 문이 있는데, 이 문은 레버를 당겨서만 열 수 있습니다. 레버 또한 통로들 중 한 칸에 있습니다. 따라서, 출발 지점에서 먼저 레버가 있는 칸으로 이동하여 레버를 당긴 후 미로를 빠져나가는 문이 있는 칸으로 이동하면 됩니다. 이때 아직 레버를 당기지 않았더라도 출구가 있는 칸을 지나갈 수 있습니다. 미로에서 한 칸을 이동하는데 1초가 걸린다고 할 때, 최대한 빠르게 미로를 빠져나가는데 걸리는 시간을 구하려 합니다. 미로를 나타낸 문자열 배열 maps가 매개변.. 2023. 9. 18.
[알고리즘] 프로그래머스 - 시소짝궁(JS) ✅ 문제 어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 있습니다. 이 시소를 두 명이 마주 보고 탄다고 할 때, 시소가 평형인 상태에서 각각에 의해 시소에 걸리는 토크의 크기가 서로 상쇄되어 완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍이라고 합니다. 즉, 탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍이라고 할 수 있습니다. 사람들의 몸무게 목록 weights이 주어질 때, 시소 짝꿍이 몇 쌍 존재하는지 구하여 return 하도록 solution 함수를 완성해주세요. ✅ 풀이 제한사항을 확인했을 때, weights의 길이가 최대 100,000이기 때문에 이중 반복문을 사용.. 2023. 9. 18.
상태 끌어올리기 (feat. 제어 컴포넌트 & 비제어 컴포넌트) ✅ 컴포넌트 간의 상태공유 두 컴포넌트의 상태가 항상 동시에 변경되기를 원할 때는 각각의 컴포넌트에서 상태를 제거하고, 가장 가까운 공통 부모 컴포넌트로 이동한 다음에 이를 props를 통해서 자식 컴포넌트에 전달하는 방식을 사용하자. 이를 상태 끌어올리기(Lifting state up)라고 한다. 상태 끌어올리기 예제 아래 예제에서는 부모 컴포넌트인 Accordion이 두 개의 Panel 컴포넌트를 렌더링한다. 각각의 Panel 컴포넌트는 isActive 라는 boolean 상태를 가지고 있으며 이 상태에 따라 해당 Panel의 내용이 보이거나 감추어진다. (한 패널의 버튼을 클릭했을 때, 다른 패널에 영향을 주지 않는 독립적인 방식에 주목하자.) // App.js import { useState } .. 2023. 9. 17.
[알고리즘] 프로그래머스 - 영어 끝말잇기 (JS) ✅ 문제 1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다. 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다. 이전에 등장했던 단어는 사용할 수 없습니다. 한 글자인 단어는 인정되지 않습니다. 다음은 3명이 끝말잇기를 하는 상황을 나타냅니다. tank → kick → know → wheel → land → dream → mother → robot → tank 위 끝말잇기는 다음과 같이 진행됩니다. 1번 사람이 자신의 첫 번째 차례에 tank를 말합니다. 2번 사람이 자신의 첫 번째 차례에 k.. 2023. 9. 10.
[알고리즘] 프로그래머스 - 예상 대진표 (JS) ✅ 문제 △△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N번의 참가자끼리 게임을 진행합니다. 각 게임에서 이긴 사람은 다음 라운드에 진출할 수 있습니다. 이때, 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다. 게임은 최종 한 명이 남을 때까지 진행됩니다. 이때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번.. 2023. 9. 10.
[알고리즘] 프로그래머스 - 달리기 경주 (JS) ✅ 문제 얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다. 선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요. ✅ 풀이 해시 테.. 2023. 9. 8.
[알고리즘] 프로그래머스 - 롤케이크 자르기 (JS) ✅ 문제 철수는 롤케이크를 두 조각으로 잘라서 동생과 한 조각씩 나눠 먹으려고 합니다. 이 롤케이크에는 여러가지 토핑들이 일렬로 올려져 있습니다. 철수와 동생은 롤케이크를 공평하게 나눠먹으려 하는데, 그들은 롤케이크의 크기보다 롤케이크 위에 올려진 토핑들의 종류에 더 관심이 많습니다. 그래서 잘린 조각들의 크기와 올려진 토핑의 개수에 상관없이 각 조각에 동일한 가짓수의 토핑이 올라가면 공평하게 롤케이크가 나누어진 것으로 생각합니다. 예를 들어, 롤케이크에 4가지 종류의 토핑이 올려져 있다고 합시다. 토핑들을 1, 2, 3, 4와 같이 번호로 표시했을 때, 케이크 위에 토핑들이 [1, 2, 1, 3, 1, 4, 1, 2] 순서로 올려져 있습니다. 만약 세 번째 토핑(1)과 네 번째 토핑(3) 사이를 자르면.. 2023. 9. 8.
[정리] 자료구조와 알고리즘 마인드맵 학습해왔던 자료구조와 알고리즘을 마인드맵 형태로 정리해보았다. 이를 통해서 복기가 필요한 자료구조나, 알고리즘에 대해 빠르게 리마인드 할 수 있을 것 같다. 각 주제에 대한 세부적인 지식들을 notion 페이지를 통해 정리 중이고, 추가적으로 떠오르거나 알게되는 알고리즘들을 계속해서 업데이트 할 예정이다. [자료구조와 알고리즘 마인드맵] 2023. 9. 7.
[알고리즘] 프로그래머스 - 광물 캐기 (JS) ✅ 문제 마인은 곡괭이로 광산에서 광석을 캐려고 합니다. 마인은 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이를 각각 0개에서 5개까지 가지고 있으며, 곡괭이로 광물을 캘 때는 피로도가 소모됩니다. 각 곡괭이로 광물을 캘 때의 피로도는 아래 표와 같습니다. !https://user-images.githubusercontent.com/62426665/217975815-63c58d04-0421-4c39-85ce-17613b9c9389.png 예를 들어, 철 곡괭이는 다이아몬드를 캘 때 피로도 5가 소모되며, 철과 돌을 캘때는 피로도가 1씩 소모됩니다. 각 곡괭이는 종류에 상관없이 광물 5개를 캔 후에는 더 이상 사용할 수 없습니다. 마인은 다음과 같은 규칙을 지키면서 최소한의 피로도로 광물을 캐려고 합니다. 사.. 2023. 9. 6.
[알고리즘] 프로그래머스 - 리코쳇 로봇 (JS) ✅ 문제 리코쳇 로봇이라는 보드게임이 있습니다. 이 보드게임은 격자모양 게임판 위에서 말을 움직이는 게임으로, 시작 위치에서 목표 위치까지 최소 몇 번만에 도달할 수 있는지 말하는 게임입니다. 이 게임에서 말의 움직임은 상, 하, 좌, 우 4방향 중 하나를 선택해서 게임판 위의 장애물이나 맨 끝에 부딪힐 때까지 미끄러져 이동하는 것을 한 번의 이동으로 칩니다. 다음은 보드게임판을 나타낸 예시입니다. ...D..R .D.G... ....D.D D....D. ..D.... 여기서 "."은 빈 공간을, "R"은 로봇의 처음 위치를, "D"는 장애물의 위치를, "G"는 목표지점을 나타냅니다. 위 예시에서는 "R" 위치에서 아래, 왼쪽, 위, 왼쪽, 아래, 오른쪽, 위 순서로 움직이면 7번 만에 "G" 위치에 멈.. 2023. 9. 2.
자바스크립트 비동기 프로그래밍 (feat. 이벤트 루프, 태스크 큐) ✅ 동기 처리와 비동기 처리 동기와 비동기 동기 - 어떤 태스크가 실행 중일 때 종료될 때까지 다음 태스크가 대기하는 방식을 동기 방식이라고 표현한다. 비동기 - 현재 실행 중인 태스크가 종료되지 않았음에도 다음 태스크들을 실행하는 방식을 비동기 방식이라고 표현한다. 자바스크립트 엔진 자바스크립트 엔진은 단 하나의 실행 컨텍스트 스택(콜 스택)을 갖는다. 코드가 평가되어 코드의 실행 컨텍스트가 생성되고 하나의 콜 스택에 저장된다. 그리고 LIFO(Last In First Out) 방식으로 실행 컨텍스트들이 실행된다. (최상위에 있는 실행 컨텍스트 = 현재 실행중인 실행 컨텍스트) 이는 곧 하나의 실행 컨텍스트가 팝되어 실행 중일 때, 콜 스택 내부에서 기다리고 있는 실행 컨텍스트들은 실행될 수 없다는 것.. 2023. 9. 1.
[알고리즘] 프로그래머스 - n^2 배열 자르기 (JS) ✅ 문제 정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다. n행 n열 크기의 비어있는 2차원 배열을 만듭니다. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다. 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다. 정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요. ✅ 풀이 시간초과 풀이 .. 2023. 9. 1.
[알고리즘] 프로그래머스 - 무인도 여행 (JS) ✅ 문제 메리는 여름을 맞아 무인도로 여행을 가기 위해 지도를 보고 있습니다. 지도에는 바다와 무인도들에 대한 정보가 표시돼 있습니다. 지도는 1 x 1크기의 사각형들로 이루어진 직사각형 격자 형태이며, 격자의 각 칸에는 'X' 또는 1에서 9 사이의 자연수가 적혀있습니다. 지도의 'X'는 바다를 나타내며, 숫자는 무인도를 나타냅니다. 이때, 상, 하, 좌, 우로 연결되는 땅들은 하나의 무인도를 이룹니다. 지도의 각 칸에 적힌 숫자는 식량을 나타내는데, 상, 하, 좌, 우로 연결되는 칸에 적힌 숫자를 모두 합한 값은 해당 무인도에서 최대 며칠동안 머물 수 있는지를 나타냅니다. 어떤 섬으로 놀러 갈지 못 정한 메리는 우선 각 섬에서 최대 며칠씩 머물 수 있는지 알아본 후 놀러갈 섬을 결정하려 합니다. 지도.. 2023. 9. 1.
[알고리즘] 프로그래머스 - 숫자 변환하기 (JS) ✅ 문제 자연수 x를 y로 변환하려고 합니다. 사용할 수 있는 연산은 다음과 같습니다. x에 n을 더합니다 x에 2를 곱합니다. x에 3을 곱합니다. 자연수 x, y, n이 매개변수로 주어질 때, x를 y로 변환하기 위해 필요한 최소 연산 횟수를 return하도록 solution 함수를 완성해주세요. 이때 x를 y로 만들 수 없다면 -1을 return 해주세요. ✅ 풀이 첫 번째 접근방식 (DFS) 모든 경우의 수를 DFS로 탐색하면서 nx === y 일 때 answer에 담아준 뒤 최솟값을 출력해주었다. 결과는 반만 맞았다. 런타임 에러는 왜 발생하는지 정확하게는 모르겠지만.. 추측건데 재귀로 인한 스택 오버 플로우 문제인 것 같다. 점수 50 / 100 테스트 케이스 5, 9, 10, 11, 14 (.. 2023. 8. 30.
[알고리즘] 프로그래머스 - 공원 산책 (JS) ✅ 문제 지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다. ["방향 거리", "방향 거리" … ] 예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다. 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다. 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다. 위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다. 공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표.. 2023. 8. 29.
[알고리즘] 프로그래머스 - 호텔 대실 (JS) ✅ 문제 호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다. 예약 시각이 문자열 형태로 담긴 2차원 배열 book_time 이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요. ✅ 풀이 그리디 알고리즘을 사용해서 풀이할 수 있는 “회의실 배정” 문제와 닮아있다. 각 호텔 방의 대실 시작 시간과 종료 시간이 정해져 있고 가장 적은 호텔 방을 이용해서 주어진 손님들을 받아야한다. 대실 시작 시간을 기준으로 book_time을 정렬해준다. book_time 을 돌면서 새로운 호텔 방을 배정받을 지 OR 다른 손님이 묵.. 2023. 8. 29.
[알고리즘] 프로그래머스 - 뒤에 있는 큰 수 찾기 (JS) ✅ 문제 정수로 이루어진 배열 numbers 가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다. 정수 배열 numbers 가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다. ✅ 풀이 이중반복문(O(N^2))을 이용한 풀이 → 테스트 20,21,22,23 시간 초과. 스택(O(N))을 이용해서 풀이해야 한다. numbers 배열을 역순으로 순회하면서 각 원소에 대해서 스택을 사용하여 뒷 큰수를 찾는다. (이 때, 각 원소는 한 번씩 스택에 푸시되고 팝되므로 모든 원소에 대해 스택 연산이 상.. 2023. 8. 28.
[알고리즘] 프로그래머스 - 택배 상자 (JS) ✅ 문제 영재는 택배상자를 트럭에 싣는 일을 합니다. 영재가 실어야 하는 택배상자는 크기가 모두 같으며 1번 상자부터 n번 상자까지 번호가 증가하는 순서대로 컨테이너 벨트에 일렬로 놓여 영재에게 전달됩니다. 컨테이너 벨트는 한 방향으로만 진행이 가능해서 벨트에 놓인 순서대로(1번 상자부터) 상자를 내릴 수 있습니다. 하지만 컨테이너 벨트에 놓인 순서대로 택배상자를 내려 바로 트럭에 싣게 되면 택배 기사님이 배달하는 순서와 택배상자가 실려 있는 순서가 맞지 않아 배달에 차질이 생깁니다. 따라서 택배 기사님이 미리 알려준 순서에 맞게 영재가 택배상자를 실어야 합니다. 만약 컨테이너 벨트의 맨 앞에 놓인 상자가 현재 트럭에 실어야 하는 순서가 아니라면 그 상자를 트럭에 실을 순서가 될 때까지 잠시 다른 곳에 .. 2023. 8. 28.
[알고리즘] 프로그래머스 - 둘만의 암호 (JS) ✅ 문제 두 문자열 s와 skip, 그리고 자연수 index가 주어질 때, 다음 규칙에 따라 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다. 문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다. index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다. skip에 있는 알파벳은 제외하고 건너뜁니다. 예를 들어 s = "aukks", skip = "wbqd", index = 5일 때, a에서 5만큼 뒤에 있는 알파벳은 f지만 [b, c, d, e, f]에서 'b'와 'd'는 skip에 포함되므로 세지 않습니다. 따라서 'b', 'd'를 제외하고 'a'에서 5만큼 뒤에 있는 알파벳은 [c, e, f, g, h] 순서에 의해 'h'가 됩니다. 나머지 "ukks" 또한 위 규.. 2023. 8. 28.
[알고리즘] 프로그래머스 - 귤 고르기 (JS) ✅ 문제 경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다. 예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다. 경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 .. 2023. 8. 28.
[알고리즘] 프로그래머스 - 문자열 나누기 (JS) ✅ 문제 문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다. 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다. 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다. s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다. 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다. 문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요. ✅.. 2023. 8. 28.
[알고리즘] 프로그래머스 - 모의고사 (JS) ✅ 문제 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ... 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성.. 2023. 8. 28.
[알고리즘] 백준 2529 - 부등호 (JS) ✅ 문제 종류의 부등호 기호 ‘’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시된 부등호 순서열 A가 다음과 같다고 하자. A ⇒ 부등호 기호 앞뒤에 넣을 수 있는 숫자는 0부터 9까지의 정수이며 선택된 숫자는 모두 달라야 한다. 아래는 부등호 순서열 A를 만족시키는 한 예이다. 3 1 7 0 이 상황에서 부등호 기호를 제거한 뒤, 숫자를 모두 붙이면 하나의 수를 만들 수 있는데 이 수를 주어진 부등호 관계를 만족시키는 정수라고 한다. 그런데 주어진 부등호 관계를 만족하는 정수는 하나 이상 존재한다. 예를 들어.. 2023. 8. 18.
[알고리즘] 백준 1963 - 소수 경로 (JS) ✅ 문제 소수를 유난히도 좋아하는 창영이는 게임 아이디 비밀번호를 4자리 ‘소수’로 정해놓았다. 어느 날 창영이는 친한 친구와 대화를 나누었는데: “이제 슬슬 비번 바꿀 때도 됐잖아” “응 지금은 1033으로 해놨는데... 다음 소수를 무엇으로 할지 고민중이야" “그럼 8179로 해” “흠... 생각 좀 해볼게. 이 게임은 좀 이상해서 비밀번호를 한 번에 한 자리 밖에 못 바꾼단 말이야. 예를 들어 내가 첫 자리만 바꾸면 8033이 되니까 소수가 아니잖아. 여러 단계를 거쳐야 만들 수 있을 것 같은데... 예를 들면... 1033 1733 3733 3739 3779 8779 8179처럼 말이야.” “흠...역시 소수에 미쳤군. 그럼 아예 프로그램을 짜지 그래. 네 자리 소수 두 개를 입력받아서 바꾸는데 .. 2023. 8. 18.
[알고리즘] 백준 1303 - 전쟁 - 전투 (JS) ✅ 문제 전쟁은 어느덧 전면전이 시작되었다. 결국 전투는 난전이 되었고, 우리 병사와 적국 병사가 섞여 싸우게 되었다. 그러나 당신의 병사들은 흰색 옷을 입고, 적국의 병사들은 파란색 옷을 입었기 때문에 서로가 적인지 아군인지는 구분할 수 있다. 문제는 같은 팀의 병사들은 모이면 모일수록 강해진다는 사실이다. N명이 뭉쳐있을 때는 N2의 위력을 낼 수 있다. 과연 지금 난전의 상황에서는 누가 승리할 것인가? (단, 같은 팀의 병사들이 대각선으로만 인접한 경우는 뭉쳐 있다고 보지 않는다.) ✅ 조건 시간 제한 메모리 제한 2 초 128 MB ✅ 입력 첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있.. 2023. 8. 18.
[운영체제] PintOS - Project 3. Virtual Memory (3) ✅ 과제 New Virtual Memory with Fork() Stack Growth Mmap 과 Munmap Swap In / Swap Out ‼️ New Virtual Memory with Fork()… 기존의 가상 메모리 시스템(? 미구현 상태) 하에서 fork() 시스템 콜을 호출한다면? 부모의 pml4를 그대로 자식에게 전달해주었다. 새로운 가상 메모리 시스템에서 우리는 프로세스마다의 supplemental page table을 추가하여 페이지들을 관리해주고 있으므로 fork()를 통해 자식 프로세스가 생성되었을 때 spt 또한 넘겨주어야 한다. 즉, bool supplemental_page_table_copy (struct supplemental_page_table *dst, struct s.. 2023. 6. 27.
[운영체제] PintOS - Project 3. Virtual Memory (2) ✅ 과제 Virtual memory (in pintos) Supplemental Page Table Anonymous Page & Lazy loading ‼️ Virtual memory (in PintOS) 아래 그림을 통해 핀토스의 가상 메모리에 대해 이해해보자. 프로세스들은 독립된 가상 메모리 공간을 가진다. 그리고 가상 메모리 공간은 커널 영역과 유저 영역으로 나뉜다. (어차피 가상 메모리는 페이지 단위로 구성되어있기 때문에 각각을 커널 페이지, 유저 페이지라고 표현한다.) 두 영역의 경계는 KERN_BASE 라는 상수로 vaddr.h 에 선언되어 있으며, 그 값은 0x8004000000이다. 즉, 가상 메모리의 커널 페이지 영역은 0x8004000000 보다 높은 곳에 위치해있다. 이말인 즉슨 0.. 2023. 6. 26.
[운영체제] PintOS - Project 3. Virtual Memory (1) ✅ 주요 학습 내용 Virtual memory management Page type Swap in/out ‼️ Virtual memory management paging : 가상 메모리를 고정된 크기의 page 단위로 나누어서(고정 분할 방식) 관리하는 기법. virtual page 가상 페이지는 모두 같은 크기를 가진다. → 페이지 크기는 하드웨어에 의해 정해지고 일반적으로 2의 제곱수를 사용한다. 페이지 테이블을 이용해서 가상 메모리 주소에서 물리 메모리 주소로 매핑한다. physical frame 물리 메모리 공간을 페이지와 같은 사이즈로 나눈 것을 프레임이라고 한다. 프레임 크기도 페이지 사이즈와 동일하게 하드웨어에 의해 정해진다. page table & supplementary page tabl.. 2023. 6. 18.