목록알고리즘 (83)
Joonas' Note
링크: https://www.acmicpc.net/problem/11447문제문제에서 정의되는 x, y, z 방향으로 1000을 넘지 않는 길이만큼 C번 움직인 후에, 마지막에 완성된 그림 속에 채워지는 삼각형의 수는 몇 개인지 맞추는 문제이다.삼각형들은 빈 공간이 없이 빽빽하게 채워져있고, 다시 시작점으로 돌아오지 않는 잘못된 입력은 주어지지 않는다. 처음에는 x,y,z 방향을 2차원 x,y 평면으로 적당히 전사시켜서 그 넓이를 구하는 방식으로 해야하나? 라는 생각을 했다. 그 외에도 문제를 변형시키는 별 생각을 다 했는데 결국 풀이는 다각형의 면적을 구하는 문제였다.풀이다각형을 이루는 꼭짓점들이 주어지면, 그 다각형의 면적을 구하는 문제이다. 이건 신발끈 공식으로 해결할 수 있다. 다각형의 각 꼭짓점..
링크: https://www.acmicpc.net/problem/1976문제\(n\)개의 도시 사이의 연결 상태가 인접 행렬로 주어지고 여행 계획에 있는 \(m\)개의 도시가 주어질 때, \(m\)개의 도시를 모두 방문할 수 있는가를 묻는 문제이다. 다시말하면, \(m\)개의 도시가 모두 연결되어있는가를 확인하면 된다. 이 문제는 서로소 집합(Disjoint-Set)으로 간단하게 해결할 수 있다. 각 도시들의 연결 상태만 확인하면 되므로, 연결된 도시들을 집합으로 묶어서 표현한 후 마지막에 주어지는 \(m\)개의 도시들이 모두 같은 집합에 속하는 지 확인하면 정답이기 때문이다.코드
링크: https://www.acmicpc.net/problem/1613이전 풀이: http://joonas-yoon.blogspot.com/2016/04/1613.html문제알고 있는 사건의 전후 관계를 방향성이 있는 간선으로 보면, 서로 다른 두 사건을 유추한다는 것은 어떤 방향으로건 일단 연결이 되어있는가를 물어보는 것이다. 방향 그래프에서 정점 a에서 b로 갈 수 있는 경로가 있는 지 물어보는 문제이다. a에서 b로 가는 경로가 있으면 앞에 있는 사건이 먼저 일어난 것이므로 -1b에서 a로 가는 경로가 있다면 1, 경로가 없다면 0을 출력하면 된다. 문제는 이러한 물음이 한두번이 아니라 s번(최대 50,000번) 물어보기 때문에, 경로를 빠르게 찾을 수 있어야한다. n이 400으로 작으므로 플로이..
링크: https://www.acmicpc.net/problem/9465예전 풀이: http://joonas-yoon.blogspot.com/2014/08/9465.html풀이한 스티커(칸)를 선택하면 인접한 칸은 선택할 수 없게 된다.그럼 대각선만 남게 되는데, 그 대각선 칸도 위 선택을 반복하게 된다. A B C DE F G H 만약 위와 같이 있다고 생각해보자. A를 고른다면 C, D, F, G, H 중에 골라야한다. E를 고른다면 B, C, D, G, H 중에 골라야한다.바로 다음 칸(열)에만 영향이 있고, 그 이후의 C, D, G, H를 고민하는 것은 변함이 없다. 즉 어떤 i번째 열을 볼때, i+2번째 이후의 열은 영향이 없다는 뜻이다. i번째 열에서 고민할 점은 3가지이다. 1. 고르지 않는..
링크: https://www.acmicpc.net/problem/10472문제각 칸이 색칠된 상태를 0/1로 보면, 3x3 크기의 보드는 크기가 9인 상태공간을 가진다.따라서 나타날 수 있는 보드의 상태의 수는 \(2^{9}\) = 512가지이다. 최초 보드의 상태에서 각 칸을 눌러보며 매번 9번의 상태 분기가 일어나는 BFS 탐색으로 해결 가능하다. 어떤 상태를 이미 확인했는 지에 사용되는 visit 배열은 취향에 따라 여러 형태가 가능할 것이다. 나는 000 000 000의 크기 9짜리 상태 공간을 2진법으로 변환하여 int 변수로 표현하였다. 그래서 visit[bit]로 했는데, key-value를 쓰면 string형으로 "000111000"처럼 저장할 수도 있다.어찌되었건 중요한건 중복 확인을 할..
링크: https://www.acmicpc.net/problem/1939 문제어떤 정점 S에서 다른 정점 E까지 가는 경로에서 등장하는 간선의 가중치의 최대값을 구하는 문제입니다. 최단 경로를 살피는 것이 아니라, 최대한 무거운 것을 옮기기 위한 다리만 선정한 경로를 만들어야하므로 최소 스패닝 트리의 반대인 최대 스패닝 트리가 떠오릅니다. 일반적으로 크루스칼 알고리즘은 최소 스패닝 트리를 위해 사용되지만, 이 경우에는 반대로 최대 스패닝 트리를 위해 사용할 수 있을 것 같습니다. (음수 가중치도 없으니 가능해보입니다.) 연결되지 않은 간선 중 가중치가 가장 큰 간선을 선택하면서 스패닝 트리를 만들어가면, 어떤 정점 S와 다른 정점 E이 같은 "연결된 집합"에 속하는 그 순간에 우리가 원하는 경로가 완성됩..
링크: https://www.acmicpc.net/problem/10799문제스택 문제로 유명한 한국정보올림피아드(KOI) 2015 지역본선 문제, 쇠막대기입니다. 사실 스택 없이 풀리는 문제지만요.문제를 읽어보면 쇠막대기의 왼쪽 끝은 여는 괄호, 오른쪽 끝은 닫힌 괄호로 표시하여, 레이저 "()"에 의해 잘려진 막대기 조각이 총 몇 개인지 구하는 문제입니다.잘못된 모양은 없다고 하니 스택으로 별다른 검증은 안해도 됩니다.풀이먼저 풀이의 중간 단계를 생각해봅시다. 문자열 "((()()))"은 쇠막대기가 2층으로 쌓인 형태일 것이고, 위 사진처럼 레이저(노란색 점선)에 의해 잘려나갈겁니다. 여기서 첫 번째 레이저에 집중해봅시다.첫 번째 레이저가 발사된다면 1층에서 2조각, 2층에서 2조각으로 나뉘어서 총 ..