본문 바로가기

Programming456

[C/C++] 백준 #1726 로봇(너비우선 탐색) 이번 문제는 복잡해 보이기는 하지만, 의미를 되새겨보면 마이크로 마우스 등에서도 사용할 수 있습니다. 실제 마이크로 마우스에서도 직진하는 경우에는 속도가 빠르기 때문에, 비슷하게 로직을 작성할 수가 있습니다. 문제는 로봇이 있는데, 현재 바라보는 방향이라면 최대 3칸까지 직진하는 명령을 줄 수 있습니다. 회전을 하는 것도 역시 명령을 줄 수 있는데, 이 때, 반시계 방향 또는 시계방향으로 90도 회전하라고 할 수 있습니다. 로봇이 움직일 공간 정보와 시작지점과 끝지점이 주어지면, 시작지점에서 끝지점까지 최소한의 명령어로 움직이게 하고싶습니다. 로봇은 동서남북 4방향으로만 바라볼 수 있고, 격자형태로 공간은 주어진다고 합니다. 아래 그림과 같이 로봇이 다닐 수 있는 길은 0의 값으로, 로봇이 갈 수 없는 .. 2022. 10. 6.
[C/C++] 백준 #1725 히스토그램(분할 정복) 히스토그램 문제는, 히스토그램 그래프에서 x축의 빈도의 너비와, y축의 값의 높이 단위 크기가 같을때, 히스토그램 그래프 안에 직사각형의 넓이가 최대가 되는 것을 구하는 문제입니다. 분할정복 문제의 전형적인 경우입니다. 예를 들어서 히스토그램의 값이 [ 3, 2, 3, 4, 2, 3, 4, 1 ]의 값을 가진다고 하면, 이를 히스토그램으로 표현하면 아래와 같습니다. 사람이 본다면 인지적으로 높이 2인 직사각형이 가장 넓을 것이라 할 수 있습니다. 하지만, 히스토그램의 x축 개수가 매우 많다면 사람이 인지적으로 판단하는 것도 힘듭니다. 컴퓨터가 푼다면, 높이 1인 것부터 차례로 찾아볼 수도 있습니다. 히스토그램의 1보다 큰 수가 얼마나 연속되었는지 찾으면 됩니다. 이것이 \(O(N)\) 알고리즘이니, 높이.. 2022. 10. 5.
[C/C++] 백준 #1722 순열의 순서(수학) 이번 문제는 순열의 순서를 아는 것입니다. 순열 경우의 수는 N이 주어지면, \(N!\)로 아주 큰 수가 됩니다. 순열의 경우의 수가 팩토리얼이라는 것은 아주 중요합니다. 우리가 10진수를 생각한다면, N자리의 숫자는 \(10^N\)개의 경우의 수를 가집니다. 이를 이용하면, 우리가 주어진 수가 몇번째 10진수인지 아주 쉽게 구할 수 있습니다. 팩토리얼로 이루어진 수도 마찬가지라고 생각하면 됩니다. N이 4라면 만들 수 있는 순열 수는 24가지가 됩니다. 1234, 1243, 1324, 1342, 1423, 1432, 2134, 2143, 2314, 2341, 2413, 2431, 3124, 3142, 3214, 3241, 3412, 3421, 4123, 4132, 4213, 4231, 4312, 432.. 2022. 10. 4.
[C/C++] 백준 #1717 집합의 표현(배타적 집합) 이번 문제는 배타적 집합(disjoint set)의 전형적인 예입니다. 배타적 집합이라는 것은 임의의 원소가 어느 하나의 집합에만 속해있는 경우입니다. 어떤 원소도 두개 이상의 집합에 속해있지 않기 때문에 일반적으로 사용하는 집합과는 다릅니다. 달리 말하면 임의의 두개의 다른 집합의 교집합은 항상 공집합이라 할 수 있습니다. 아래의 그림과 같이, 왼쪽은 배타적 집합입니다. 두 집합 A, B에 공통된 원소가 존재하지 않습니다. 그에 비해 일반 집합은 공통된 원소가 존재할 수 있습니다. 일번적으로 배타적 집합은 배열을 이용하게 됩니다. 보통은 함수를 이용해서 축약까지 넣는데, 축약을 넣지 않은 상태에서도 테스트가 통과해서 그대로 적용했네요. 축약을 사용하는 경우에는 다음과 같이 처리합니다. int getRo.. 2022. 10. 2.
[C/C++] 백준 #1715 카드 정렬하기(탐욕 알고리즘) 이번 문제는 카드 정렬하기이고요. 이 문제는 정렬된 여러개의 카드 더미가 있을 때, 모두 다 정렬하기 위해서 어떤 순으로 혼합(Merge)를 하는 것이 좋을까입니다. 각각 n과 m개의 카드를 가지고 있는 두 더미를 혼합을 하기 위해서는 \(O(n+m)\)의 비교횟수와 이동횟수를 가지고 있다는 것은 잘 알려져 있습니다. 실제 이동 횟수는 \(n+m\)번이 됩니다. 이 문제에서는 혼합을 하는 과정을 구현하는 것은 아닙니다. 정렬을 하기 위해서는 우리는 두 더미를 혼합하게 되는데, 혼합하는 순서에 따라서 전체적인 이동 횟수가 달라지게 됩니다. 더하기 연산을 할 때, 그 결과값을 모두 더하는 것과 같습니다. 3, 5, 7, 9 개의 카드가 있는 더미를 생각한다면, 1) 3 + 5 = 8 --> 총 이동횟수 : .. 2022. 10. 1.
[C/C++] 백준 #1707 이분 그래프(그래프 이론) 이번 문제는 그래프가 주어졌을 때, 정점들을 두개의 그룹을 나누었을 때, 인접한 정점들이 같은 그룹에 없도록 만들 수 있다면 이분 그래프가 됩니다. 이 문제를 풀기 위해서는 1) 현재 그룹에 참여하지 않은 임의의 정점을 고른다. 2) 해당 정점을 그룹 1에 넣는다. 그런 후 해당 정점을 큐에 넣는다. 3) 큐에서 정점을 하나 가져온다. 큐가 비어 있다면 1)번으로 돌아간다. 3) 해당 정점과 인접한 정점들 중에 해당 정점과 같은 그룹에 속해 있으면 이분그래프를 만들 수 없다. 그렇지 않고 다른 그룹에 이미 들어 있다면, 해당 정점은 무시한다. 그룹에 속해 있지 않은 정점이라면 다른 그룹에 넣고, 큐에 넣는다. 4) 3)번으로 돌아간다. 알고리즘 자체는 쉬운데, 제가 작성한 소스는 현재 그룹에 참여하지 않.. 2022. 10. 1.
728x90