
가 있다면 오른쪽 숫자가 더 크다 → (오른쪽 노드 → 현재 노드) 방향의 간선 추가
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int N; // 퍼즐 수
vector<int> adj[1000 * 1000 + 1]; //인접 리스트 2차원 그래프
int in_degree[1000 * 1000 + 1]; //진입 차수 배열(0인것부터 시작해야 함)
int puzzle[1001][1001];//결과를 저장하기 위한 배열
queue<int> q; //위상 정렬을 위한 큐
//퍼즐을 채우는 함수
void fill_puzzle(int loc, int num) {
int x = (loc - 1) / N + 1;
int y = (loc - 1) % N + 1;
puzzle[x][y] = num;
}
//위상 정렬 함수
void topological_sort() {
int num = 1;
while (!q.empty()) { //큐가 빌때까지
int curr = q.front(); //큐에 값 추출하고(현재 노드 빼기)
q.pop();
fill_puzzle(curr, num++); //퍼즐에 넣기
for (int next : adj[curr]) { //현재 노드와 ㅇ녀결된 노드들의 진입 차수 감소
in_degree[next]--;
if (in_degree[next] == 0) q.push(next); //진입 차수가 0이면 큐에 추가
}
}
}
int main() {
cin >> N;
for (int i = 1; i <= N; i++) {
for (int j = 1; j < N; j++) {
char sign;
cin >> sign;
int curr = (i - 1) * N + j;
int right = curr + 1;
if (sign == '>') {
adj[right].push_back(curr);
in_degree[curr]++;
} else {
adj[curr].push_back(right);
in_degree[right]++;
}
}
}
for (int i = 1; i < N; i++) {
for (int j = 1; j <= N; j++) {
char sign;
cin >> sign;
int curr = (i - 1) * N + j;
int down = curr + N;
if (sign == '>') {
adj[down].push_back(curr);
in_degree[curr]++;
} else {
adj[curr].push_back(down);
in_degree[down]++;
}
}
}
for (int i = 1; i <= N * N; i++) {
if (in_degree[i] == 0) q.push(i);
}
topological_sort();
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cout << puzzle[i][j] << " ";
}
cout << "\n";
}
return 0;
}ㄴ
솔직히 혼자 풀라고 했으면 못 풀었다. 친구에게 물어보고 chatgpt에게 힌트를 달라고 해서 문제를 해결했다. 추가로 블로그 글도 참고하여 문제를 풀었다.
도움 : 박연종