본문 바로가기

전체 글135

이진 탐색 이론 bisect이진 탐색이란, 기존의 하나하나 검사하는 탐색 방법보다 더 빠른 탐색 알고리즘이다. 원래대로라면 길이가 N인 배열에서 어떠한 원소를 찾고자 한다면, 처음부터 N개의 원소를 하나하나 검사해보는 방식으로 탐색을 한다. 따라서 기존의 탐색 시간복잡도는 O(N)이다. 하지만 배열이 정렬되어 있다는 가정 하에 이진 탐색은 더 빠른 시간복잡도를 보장한다. 이진탐색이란? 이진탐색이란 정렬되어있는 배열에서 특정 값을 찾는 방법이다. 찾고자 하는 값을 target이라고 할 때, 배열의 중간 위치의 값이 target보다 작은지 큰지를 검사한다. 배열을 반으로 나눈 후 중간 위치의 값이 target보다 작다면 뒤의 배열에서 같은 방식으로 탐색을 반복하고, 크다면 앞의 배열에서 같은 방식으로 탐색을 반복한다. 길이.. 2023. 2. 13.
정렬 이론 이것이 코딩테스트다에 있는 정렬은 다음과 같다. 선택정렬 삽입정렬 퀵정렬 계수정렬 1. 선택정렬 선택정렬은 가장 작은 값을 선택해 앞으로 보내는 과정을 반복하여 배열을 정렬해준다. 예를 들어 [3, 2, 5, 1, 4]라는 배열이 있다면, 이 배열에서 가장 작은 값인 1을 맨 앞의 3이랑 위치를 바꿔준다. [1, 2, 5, 3, 4]에서는 이미 정렬된 1을 제외한 [2, 5, 3, 4] 중 가장 작은 데이터인 2를 맨 앞으로 보낸다. (2가 이미 맨 앞의 숫자라 달라진 점은 없다.) 그 다음엔 [1, 2, 5, 3, 4]에서 이미 정렬된 1, 2를 제외한 [5, 3, 4] 중 가장 작은 데이터인 3을 맨 앞의 5랑 바꾼다. [1, 2, 3, 5, 4]에서 같은 방식으로 남은 5, 4의 위치를 바꿔주면 완.. 2023. 2. 13.
감자조림 오늘은 하이퍼마켓에 갔다가 감자를 너무 싸게 팔길래 바로 업어왔다. 그치만 너무 많이 사버려서 오늘 당장 뭔가 해먹어야겠다 생각했다. 처음엔 감자전을 해보려다가 감자를 갈 수가 없어서 포기... 검색 좀 하다가 감자조림으로 땅땅땅~ 사실 원래는 딱히 업로드할 생각이 없었는데 먹어보니까 너무 맛있어서 업로드 하는 것이다! 그래서 중간과정 사진이 없음 ㅜㅅㅜ (순서랑 재료만 좀 끄적이겠음) 재료 감자 2개, 당근 1/3개 양념 : 물 150ml, 진간장 5, 올리고당 3, 설탕 1, 미원 0.3?, 백종원표 매운소스 약간 레시피 재료 준비 감자, 당근 토막썰기 - 당근은 감자보다 더 작게 썰고, 감자는 찬물에 담궈두기 양념 재료 모두 섞어놓기 1. 팬에 식용유 두르고 강불에 감자만 투하 냄비에다가 하면 큰일.. 2023. 2. 10.
[백준] 1707번 이분 그래프 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/1707 이분 그래프의 개념만 익힌다면 수월하게 구상, 구현할 수 있다. [문제] 그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph)라 부른다. 그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램을 작성하시오. [입력] 입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을빈칸을 사이에 두고 순서대로 .. 2023. 2. 1.
[백준] 2206번 벽 부수고 이동하기 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/2206 구상이 상당히 힘들었다. 시간을 꽤나 사용한 것 같다. 난이도가 꽤 있었던 bfs문제이다. [문제] N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다. 만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동하여도 된다. 한 .. 2023. 2. 1.
[백준] 7576번 토마토 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/7576 예전에 풀었을 땐 꽤나 어려웠던 것 같다. 다시 풀어보니 난이도 적당한 bfs문제였다. [문제] 철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자 모양 상자의 칸에 하나씩 넣어서 창고에 보관한다. 창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토의 인접한 곳은 왼쪽, 오른쪽, 앞, 뒤 네 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는.. 2023. 1. 31.
[백준] 2606번 바이러스 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/2606 난이도 낮은 개념 공부용 문제이다. [문제] 신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다. 예를 들어 7대의 컴퓨터가 과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다. 어느 날 .. 2023. 1. 30.
BFS - 미로 탈출 [문제] N x M 크기의 직사각형 형태의 미로에 여러 마리의 괴물이 있어 이를 피해 탈출해야 한다. 현재 위치는 (1, 1)이고 미로의 출구는 (N, M)의 위치에 존재하며 한 번에 한 칸씩 이동할 수 있다. 괴물이 있는 부분은 0으로, 괴물이 없는 부분은 1로 표시되어 있다. 미로는 반드시 탈출할 수 있는 형태로 제시된다. 탈출하기 위해 움직여야 하는 최소 칸의 개수를 구하라. 칸을 셀 때는 시작 칸과 마지막 칸을 모두 포함해서 계산한다. [입력] 첫째 줄에 두 정수 N, M(4 2023. 1. 19.
DFS - 음료수 얼려 먹기 [문제] N × M 크기의 얼음 틀이 있다. 구멍이 뚫려 있는 부분은 0, 칸막이가 존재하는 부분은 1로 표시된다. 구멍이 뚫려 있는 부분끼리 상, 하, 좌, 우로 붙어 있는 경우 서로 연결되어 있는 것으로 간주한다. 이때 얼음 틀의 모양이 주어졌을 때 생성되는 총 아이스크림의 개수를 구하는 프로그램을 작성하라. 다음의 4 × 5 얼음 틀 예시에서는 아이스크림이 총 3개가 생성된다. [입력] 첫 번째 줄에 얼음 틀의 세로 길이 N과 가로 길이 M이 주어진다. (1 2023. 1. 18.
BFS 이론 BFS(깊이 우선 탐색)은 그래프에서 가까운 노드부터 탐색하는 알고리즘이다. 큐 자료구조를 이용한다. 다음과 같은 과정으로 동작한다. DFS와 마찬가지로 한 번 방문한 노드는 다시 방문하지 않는다. 따라서 방문 처리 리스트를 만들어 방문을 처리해 주며 노드에 접근하도록 한다. 큐에 시작노드를 넣고 방문처리한다. 큐에서 노드를 꺼내고, 해당 노드의 인접 노드 중 아직 방문하지 않은 노드를 모두 큐에 삽입하고 방문처리 한다. 모든 노드를 다 탐색하거나 문제를 해결해 더이상 탐색할 필요가 없을 때까지 2번 과정을 반복한다. 위와 같은 그래프가 있고, 시작 노드는 1이며 번호가 낮은 인접노드부터 방문한다고 하자. 시작노드 방문 처리 및 큐에 넣기. 큐 : 1 큐에서 1 빼고 1의 인접노드인 2 3 8방문처리 후.. 2023. 1. 18.
DFS 이론 DFS(깊이 우선 탐색)은 그래프의 깊은 부분부터 탐색하는 알고리즘이다. DFS는 스택 자료구조나 재귀함수를 이용한다. 다음과 같은 과정으로 동작한다. 한 번 방문한 노드는 다시 방문하지 않으므로, 보통은 방문처리 리스트를 만들어 그 안에 False인지 True인지를 체크하는 방식으로 방문 여부를 파악한다. 스택에 시작 노드를 넣고 방문처리한다. 스택의 최상단 노드에 연결된 노드 중, 아직 방문하지 않은 노드가 있다면 그 노드를 스택에 넣고 방문처리한다. 방문하지 않은 노드가 없다면 그 최상단 노드를 꺼낸다. 스택에 아무 것도 없을 때 까지(혹은 문제에서 주어진 답을 풀 때 까지?) 반복한다. 위와 같은 그래프가 있고, 시작노드는 1이며, 번호가 낮은 인접노드부터 방문한다고 하자. 시작노드인 1을 방문처.. 2023. 1. 17.
[백준] 5904번 Moo 게임 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/5904 구상하기에 좀 어려웠다. 다른 풀이법 참고 하여 구상을 하였더니, 어렵지 않게 구현에 성공하였다. [문제] Moo는 술자리에서 즐겁게 할 수 있는 게임이다. 이 게임은 Moo수열을 각 사람이 하나씩 순서대로 외치면 되는 게임이다. Moo 수열은 길이가 무한대이며, 다음과 같이 생겼다. m o o m o o o m o o m o o o o m o o m o o o m o o m o o o o o Moo 수열은 다음과 같은 방법으로 재귀적으로 만들 수 있다. 먼저, S(0)을 길이가 3인 수열 "m o o"이라고 하자. 1보다 크거나 같은 모든 k에 대해서, S(k)는 S(k-1)과.. 2023. 1. 17.
[백준] 1662번 압축 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/1662 스택과 재귀를 동시에 다룬 문제여서 참신하고 재미있었다. 난이도가 꽤 있는 문제인 것 같다. [문제] 압축되지 않은 문자열 S가 주어졌을 때, 이 문자열중 어떤 부분 문자열은 K(Q)와 같이 압축 할 수 있다. K는 한자리 정수이고, Q는 0자리 이상의 문자열이다. 이 Q라는 문자열이 K번 반복된다는 뜻이다. 압축된 문자열이 주어졌을 때, 이 문자열을 다시 압축을 푸는 프로그램을 작성하시오. [입력] 첫째 줄에 압축된 문자열 S가 들어온다. S의 길이는 최대 50이다. 문자열은 (, ), 0-9사이의 숫자로만 들어온다. [출력] 첫째 줄에 압축되지 않은 문자열의 길이를 출력한다. 이 .. 2023. 1. 9.
[백준] 2448번 별 찍기 - 11 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/2448 역시 골드 넘어가는 재귀문제는 난이도가 살짝 있다. 구상과 구현 모두 쉽지 않았다. [문제] 예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요. [입력] 첫째 줄에 N이 주어진다. N은 항상 3×2^k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수) [출력] 첫째 줄부터 N번째 줄까지 별을 출력한다. 예제 입력 예제 출력 24 아이디어 한 삼각형 당 내부 삼각형이 네 개가 있다. 가운데 삼각형은 싹 비우고, 나머지 세 삼각형은 다시 재귀함수를 호출해 가운데 삼각형을 비워준다. 세 삼각형 각각에 대한 나머지 세 삼각형에서 또 재귀함수를.. 2023. 1. 9.
[백준] 1074번 Z (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/1074 사고력을 요하는 재귀문제였다. 구상하는데 적당한 난이도가 있었고, 구현하는데도 적당한 난이도가 있었다. [문제] 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을 크기가 2^(N-1) × 2^(N-1)로 4등분 한 후에 재귀적으로 순서대로 방문한다. 다음 예는 2^2 × 2^2 크기의 배열을 방문한 순서이다. N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오. 다음은 N=3일 때의 예이다. [입.. 2023. 1. 8.
[백준] 5430번 AC (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/5430 문자열을 다루는 것이 조금 까다로웠던 문제이다. 자료구조적 요소는 많지 않았던 것 같다. [문제] 선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다. 함수 R은 배열에 있는 수의 순서를 뒤집는 함수이고, D는 첫 번째 수를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다. 함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다.. 2023. 1. 8.
[백준] 1021번 회전하는 큐 (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/1021 쉬운 큐 자료구조 문제이다. [문제] 지민이는 N개의 원소를 포함하고 있는 양방향 순환 큐를 가지고 있다. 지민이는 이 큐에서 몇 개의 원소를 뽑아내려고 한다. 지민이는 이 큐에서 다음과 같은 3가지 연산을 수행할 수 있다. 첫 번째 원소를 뽑아낸다. 이 연산을 수행하면, 원래 큐의 원소가 a1, ..., ak이었던 것이 a2, ..., ak와 같이 된다. 왼쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 a2, ..., ak, a1이 된다. 오른쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 ak, a1, ..., ak-1이 된다.. 2023. 1. 8.
[백준] 15828번 Router (Python) 정답 코드 및 풀이는 맨 아래에 있습니다. https://www.acmicpc.net/problem/15828 쉬운 큐 자료구조 문제이다. [문제] 인터넷을 사용하기 위해서는 컴퓨터에 인터넷 회선을 연결하거나 Wi-Fi를 연결해야 한다. 이렇게 연결된 네트워크를 통해 컴퓨터에는 통신이 가능하다. 마음에 드는 노래나 동영상이 있는 곳에 파일을 전송해달라는 요청을 보내고 파일을 받는 식으로 말이다. 우리가 보낸 요청은 어떻게 목적지까지 도달하는 것일까? 컴퓨터에서는 패킷이라고 하는 형태로 정보를 주고 받는다. 네트워크의 유저들은 1:1로 연결되어 있지 않으므로, 일반적으로 패킷은 라우터라는 장비를 여러 번 거친다. 그러면 라우터에서는 패킷을 다른 라우터로 보내거나, 만약 목적지와 직접적으.. 2023. 1. 8.
[백준] 17298번 오큰수 (Python) https://www.acmicpc.net/problem/17298 쉽다고 생각하였으나 생각보다 어려웠던 문제. 스택 문제라고 생각하고 풀어서 그나마 구상을 조금 할 수 있었지만, 스택문제임을 몰랐다면 더더욱 어려웠을 것 같다. [문제] 크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오큰수 NGE(i)를 구하려고 한다. Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오큰수는 -1이다. 예를 들어, A = [3, 5, 2, 7]인 경우 NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1이다. A = [9, 5, 4, 8]인 경우에는 NGE(1).. 2023. 1. 6.
[백준] 9935번 문자열 폭발 (Python) https://www.acmicpc.net/problem/9935 조금 난이도 있는 스택 문제였다. pop과 append를 필요할 때에 맞춰 사용하는 능력을 필요로한다. [문제] 상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다. 폭발은 다음과 같은 과정으로 진행된다. 문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다. 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다. 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다. 상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다. 남아있는 문자가.. 2023. 1. 6.