Skip to content

Commit c6248de

Browse files
committed
[Gold V] Title: 멀티버스 Ⅱ, Time: 300 ms, Memory: 109760 KB -BaekjoonHub
1 parent 19519e9 commit c6248de

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [Gold V] 멀티버스 Ⅱ - 18869
2+
3+
[문제 링크](https://www.acmicpc.net/problem/18869)
4+
5+
### 성능 요약
6+
7+
메모리: 109760 KB, 시간: 300 ms
8+
9+
### 분류
10+
11+
값 / 좌표 압축, 정렬
12+
13+
### 제출 일자
14+
15+
2025년 6월 6일 20:37:03
16+
17+
### 문제 설명
18+
19+
<p>M개의 우주가 있고, 각 우주에는 1부터 N까지 번호가 매겨진 행성이 N개 있다. 행성의 크기를 알고 있을때, 균등한 우주의 쌍이 몇 개인지 구해보려고 한다. 구성이 같은데 순서만 다른 우주의 쌍은 한 번만 센다.</p>
20+
21+
<p>두 우주 A와 B가 있고, 우주 A에 있는 행성의 크기는 A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>N</sub>, 우주 B에 있는 행성의 크기는 B<sub>1</sub>, B<sub>2</sub>, ..., B<sub>N</sub>라고 하자. 두 우주의 행성 크기가 모든 1 ≤ i, j ≤ N에 대해서 아래와 같은 조건을 만족한다면, 두 우주를 균등하다고 한다.</p>
22+
23+
<ul>
24+
<li>A<sub>i</sub> < A<sub>j</sub> → B<sub>i</sub> < B<sub>j</sub></li>
25+
<li>A<sub>i</sub> = A<sub>j</sub> → B<sub>i</sub> = B<sub>j</sub></li>
26+
<li>A<sub>i</sub> > A<sub>j</sub> → B<sub>i</sub> > B<sub>j</sub></li>
27+
</ul>
28+
29+
### 입력
30+
31+
<p>첫째 줄에 우주의 개수 M과 각 우주에 있는 행성의 개수 N이 주어진다. 둘째 줄부터 M개의 줄에 공백으로 구분된 행성의 크기가 한 줄에 하나씩 1번 우주부터 차례대로 주어진다.</p>
32+
33+
### 출력
34+
35+
<p>첫째 줄에 균등한 우주의 쌍의 개수를 출력한다.</p>
36+
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import Foundation
2+
class FileIO {
3+
@inline(__always) private var buffer: [UInt8] = Array(FileHandle.standardInput.readDataToEndOfFile()) + [0], byteIdx = 0
4+
5+
@inline(__always) private func readByte() -> UInt8 {
6+
defer { byteIdx += 1 }
7+
return buffer.withUnsafeBufferPointer { $0[byteIdx] }
8+
}
9+
10+
@inline(__always) func readInt() -> Int {
11+
var number = 0, byte = readByte(), isNegative = false
12+
while byte == 10 || byte == 32 { byte = readByte() }
13+
if byte == 45 { byte = readByte(); isNegative = true }
14+
while 48...57 ~= byte { number = number * 10 + Int(byte - 48); byte = readByte() }
15+
return number * (isNegative ? -1 : 1)
16+
}
17+
}
18+
19+
let io = FileIO()
20+
21+
let m = io.readInt()
22+
let n = io.readInt()
23+
24+
let stars: [[Int]] = (0..<m).map { _ in (0..<n).map { _ in io.readInt()} }
25+
let indexList = stars.map { Set($0).sorted { $0 < $1 } }
26+
var answer = 0
27+
let pressedStars = stars.enumerated().map { i, v in v.map{ e in binSearch(indexList[i], e) } }
28+
29+
for i in 0..<stars.count-1 {
30+
for j in i+1..<stars.count {
31+
if pressedStars[i] == pressedStars[j] { answer += 1 }
32+
}
33+
}
34+
35+
print(answer)
36+
37+
func binSearch(_ array: [Int], _ target: Int) -> Int {
38+
var s = 0
39+
var e = array.count-1
40+
while s <= e {
41+
let mid = (s + e) / 2
42+
if array[mid] == target {
43+
return mid
44+
}
45+
if array[mid] > target {
46+
e = mid-1
47+
} else {
48+
s = mid+1
49+
}
50+
}
51+
return -1
52+
}

0 commit comments

Comments
 (0)