본문 바로가기
📊알고리즘/BOJ

BOJ 18869 - 멀티버스 II

by meteorfish 2024. 4. 15.
728x90

18869번: 멀티버스 Ⅱ (acmicpc.net)

 

18869번: 멀티버스 Ⅱ

M개의 우주가 있고, 각 우주에는 1부터 N까지 번호가 매겨진 행성이 N개 있다. 행성의 크기를 알고 있을때, 균등한 우주의 쌍이 몇 개인지 구해보려고 한다. 구성이 같은데 순서만 다른 우주의 쌍

www.acmicpc.net

 

1차 시도

처음에 각 우주에서 행성 2개씩 비교한 후, 각 위치에 대응하는 비교한 값을 다 더해서 그 갯수로 균등한 우주의 쌍을 구했다. 이 방법은 행성이 4개 이상일 때는 작동하지 않아서 바로 포기했다.

 

접근방법

정렬

각 행성의 인덱스를 저장한 후, 행성의 크기로 Sort를 하게 되면 각 우주에서 행성들의 인덱스 순서는 똑같아진다.

만약 이 행성의 인덱스가 다르면 균등한 우주가 아니다.

 

여기에 예외가 있다

2 5

1 1 1 2 3

1 1 1 1 2

 

위 예제에선 1 < 2 이고 1 < 1이기에 답은 0 이지만, 코드의 출력은 1이 나온다.

이를 해결하기 위해선 행성을 비교할 때, Size를 비교하는 조건도 추가해야 한다.

 

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#include<cstring>
#include<map>

using namespace std;

int n,m;
pair<int,int> universe[101][10001];

int main() {
	cin.tie(NULL); ios_base::sync_with_stdio(false);
	cin >> m >> n;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			int tmp; cin >> tmp;
			universe[i][j] = make_pair(tmp, j);
		}
		sort(&universe[i][0], &universe[i][n]);
	}

	bool flag = false;
	int cnt = 0;
	for (int i = 0; i < m - 1; i++) {
		for (int j = i + 1; j < m; j++) {
			bool flag = false;
			for (int k = 0; k < n; k++) {
				if (universe[i][k].second != universe[j][k].second) {
					flag = true;
					break;
				}
				else {
					if (k < n - 1) {
						if ((universe[i][k].first == universe[i][k + 1].first)
							!= (universe[j][k].first == universe[j][k+1].first)) {
							flag = true;
							break;
						}

					}
				}
			}
			if (!flag)
				cnt++;
		}
	}
	
	cout << cnt;
	return 0;
}

728x90

'📊알고리즘 > BOJ' 카테고리의 다른 글

BOJ 3151 - 합이 0  (0) 2024.04.17
BOJ 14921 - 용액 합성하기  (1) 2024.04.16
BOJ 2295 - 세 수의 합  (0) 2024.04.13
BOJ 16401 - 과자 나눠주기  (1) 2024.04.13
BOJ 2252 - 줄 세우기  (0) 2024.04.06