본문 바로가기

분류 전체보기

(100)
c언어로 알고리즘퍼즐68 (프리렉) 풀기 Q58 셀의 병합 패턴 (세번째 방법 - 동적계획법) [문제]N x N 개의 칸을 병합하는 가짓수를 구하고자 한다. (병합된 셀은 직사각 또는 정사각 형태여야 한다.)예를 들어 2 X 2에서는 아래 8가지가 가능하다.4 x 4 개의 칸을 병합하는 총 가짓수는? (추가로 1 x 1 칸이 없도록 할 때 그 가짓수는?) [알고리즘#3] 책에서 소개한 방법으로 동적계획법으로도 풀 수 있다.이 방법을 사용하면 메모화도 필요 없으며 상당히 빠르게 답을 구할 수 있다.방법은 다음과 같다.예를 들어 아래와 같은 케이스가 있다고 하자.4 x 4 칸이라면 내부에 9개의 격자점(빨간 점)이 존재한다.각 격자점에는 아래와 같은 경계선이 존재한다. 위와 같이 각 격자점에는 경계선이 올 수 있는데, 각 격자점에 올 수 있는 경계선의 종류는 총 8가지이다.물론 경계선끼리는 서로 연결..
c언어로 알고리즘퍼즐68 (프리렉) 풀기 Q58 셀의 병합 패턴 (두번째 방법 - 비트 마스크 및 메모화, 해시테이블) [문제]N x N 개의 칸을 병합하는 가짓수를 구하고자 한다. (병합된 셀은 직사각 또는 정사각 형태여야 한다.)예를 들어 2 X 2에서는 아래 8가지가 가능하다.4 x 4 개의 칸을 병합하는 총 가짓수는? (추가로 1 x 1 칸이 없도록 할 때 그 가짓수는?) [알고리즘#2]이 문제는 다음과 같이 생각할 수도 있다.[0]칸을 포함하는 병합 셀의 가짓수는 총 16가지이다. (병합 셀의 크기: n x n, 단 n = 1, 2, 3, 4 - 총 16가지)이 각각의 병합 셀을 마스크라고 하자.이제 이 [0]에 위 16가지 마스크 중 1가지를 배치하고, [1]로 넘어간다. 예를 들어 [0]에 아래와 같이 배치했다고 하자.[1]은 이미 채워져 있으므로, 다음 칸인 [2]로 이동한다.[2]에는 다음과 같이 8가지 ..
c언어로 알고리즘퍼즐68 (프리렉) 풀기 Q58 셀의 병합 패턴 (첫번째 방법) [문제]N x N 개의 칸을 병합하는 가짓수를 구하고자 한다. (병합된 셀은 직사각 또는 정사각 형태여야 한다.)예를 들어 2 X 2에서는 아래 8가지가 가능하다.4 x 4 개의 칸을 병합하는 총 가짓수는? (추가로 1 x 1 칸이 없도록 할 때 그 가짓수는?) [알고리즘 #1]일단 직관적으로 떠오르는 방법은 map[N][N]을 만들어서, [1][1]에서부터 차례로 숫자를 채워나가는 것이다.(같은 숫자를 가진 칸들은 병합된 칸을 의미한다.) 예를 들어, 아래 [x][y]에 숫자를 채워넣으려고 할 때 총 4가지 케이스가 가능하다. 1) map[x][y-1] == map[x-1][y]인 경우, (이 때는 필연적으로 map[x-1][y-1] 역시 같은 숫자이다.)이 때 노란색 칸에 올 수 있는 숫자는 3 뿐..
클래스형 포인터 및 함수 활용 매개변수로 클래스형 포인터를 받아서, 클래스 및 클래스형 포인터를 반환하는 함수에 대해서 알아본다. 일단 Point 클래스를 생성class Point {private: double x, y;public: Point(); Point(double _x, double _y); Point(const Point& p); ~Point(); double getX() const; double getY() const; void print() const; void setX(double _x); void setY(double _y);};Point::Point() : x(0), y(0) { }Point::Point(double _x, double _y) : x(_x), y..
c언어로 알고리즘퍼즐68 (프리렉) 풀기 Q57 수건 돌리기의 총 달린 거리 [문제] n 명의 사람들이 원형으로 앉아 수건돌리기 놀이를 한다. (술래까지 포함하면 총 n + 1 명이다)편의상 (맨 처음) 술래는 0번이라고 하고, 나머지 사람들은 1 ~ n번이라고 한다.게임 시작: [1, 2, 3, 4, 5, 6, ..., n - 1, n] // 술래 = 01) 게임을 시작할 때 0번은 1번 뒤에 수건을 놓는다. 그리고 시계방향으로 1바퀴를 돈다. 1바퀴 둘레의 길이를 n이라고 하면 0번이 뛴 거리는 n이다.[0, 2, 3, 4, 5, 6, ..., n - 1, n] // 술래 = 12) 이제 1번이 술래가 된다. 1번은 2 ~ n 중에서 놓고 싶은 위치에 수건을 놓을 수 있다. 만약에 5번 뒤에 수건을 놓았다면[0, 2, 3, 4, 1, 6, ..., n - 1, n] // 술래..
c언어로 알고리즘퍼즐68 (프리렉) 풀기 Q56 가장 빠른 비상연락망 [문제]선생님 1명에 학생 14명으로 구성된 한 학급의 비상연락망을 구축하고자 한다. 0) 14명의 학생 모두 1번씩은 연락을 받아야 하며, 선생님은 모든 학생이 연락을 잘 받았는지를 확인해야 한다.1) 선생님은 각 학생들에게 연락을 직접 취할 수 있다. 2) 선생님으로부터든 학생으로부터든 연락을 받은 학생은 다른 학생한테 연락을 취할 수 있다.3) 1)의 경우에는 학생이 직접 선생님으로부터 연락을 받았으므로 다시 선생님한테 회신할 필요가 없다.4) 2)의 경우에는 연락 받은 학생이 다른 학생에게 연락을 하거나 아니면 선생님에게 회신을 줘야 한다. 5) 연락 시간은 회당 1분이며, 한 번에 1번만 취할 수 있다. (동시에 2명에게 연락할 수 없다.) [예시1] 총 걸린 시간은 9분이고, 선생님 연락 횟수..
c언어로 알고리즘퍼즐68 (프리렉) 풀기 Q55 사다리 타기의 가로 선 (두번째 방법) [문제] 7개의 세로 선이 있고, 여기에 가로 선들을 그어 사다리 타기를 만든다고 하자.윗 숫자는 1, 2, 3, 4, 5, 6, 7 로 고정한다.가로 선을 10개 그어서 만들 수 있는 패턴(아랫 숫자)의 가짓수는?[예시1] 가로 선 10개를 그어서 나오는 패턴 중 1가지단, 10개를 그어서 만들 수 있는 패턴이라고 하더라도, 그 보다 적은 수로도 만들 수 있는 패턴이라면 제외하기로 한다.예를 들어 아래 그림의 패턴은 선 2개만으로도 구현할 수 있으므로 제외한다. [알고리즘] 책에서 소개한 방법으로 상당히 멋진 풀이 방법이다.n개의 세로 선이 있고, 어떤 패턴에 대해서 최소 가로선으로 사다리를 만들었다고 하자.여기에 세로 선 1개를 추가로 넣는다. 추가로 넣는 것은 n + 1가지 방법이 가능하다.예를 ..
c언어로 알고리즘퍼즐68 (프리렉) 풀기 Q55 사다리 타기의 가로 선 (첫번째 방법) [문제] 7개의 세로 선이 있고, 여기에 가로 선들을 그어 사다리 타기를 만든다고 하자.윗 숫자는 1, 2, 3, 4, 5, 6, 7 로 고정한다.가로 선을 10개 그어서 만들 수 있는 패턴(아랫 숫자)의 가짓수는?[예시1] 가로 선 10개를 그어서 나오는 패턴 중 1가지단, 10개를 그어서 만들 수 있는 패턴이라고 하더라도, 그 보다 적은 수로도 만들 수 있는 패턴이라면 제외하기로 한다.예를 들어 아래 그림의 패턴은 선 2개만으로도 구현할 수 있으므로 제외한다. [알고리즘]간단하게 n = 4인 경우에 대해서 먼저 살펴보기로 한다.1) line = 0개인 경우: 패턴은 1234이다.arr = { 1234 }2) line = 1개인 경우 : line은 총 3군데에 그릴 수 있고 가능한 패턴은 2134, ..