알고리즘/백준

[백준/Swift] 7795번: 먹을 것인가 먹힐 것인가

녕이 2023. 1. 31. 15:24
728x90

 

https://www.acmicpc.net/problem/7795

 

7795번: 먹을 것인가 먹힐 것인가

심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을

www.acmicpc.net

 

이분 탐색으로도 풀 수 있지만 나는 문자열 함수를 사용해서 간단하게 풀었다.

우선 B를 정렬해 두고, A를 순회하면서 A의 생물보다 큰 생물의 첫 번째 인덱스를 구해서 그 값을 answer에 더해줬다.

여기서 주의할 것은 A는 자기보다 작은 애만 먹을 수 있다는 것. 크기가 같은 것은 못 먹는다.

 

조건들을 좀 더 추가했는데,

만약 B의 가장 큰 생물보다 더 크다면 B의 크기를 더한다

B의 가장 작은 생물보다 더 작다면 패스 (forEach는 continue 사용 불가이므로 그냥 0 더해줬다. 이 정도는 미미해서 괜찮을 듯싶다)

위 두 가지 조건이 아니라면, firstIndex로 A 생물보다 더 큰 생물의 첫 번째 인덱스를 answer에 더했다.

 

* 매번 print 출력하면 시간 효율에 안 좋기 때문에 result에 넣어서 한 번에 출력해 줬다.

 

import Foundation

/*
 A는 자기보다 크기가 작은 B를 먹는다.
 A의 크기가 B보다 큰 쌍은 몇 개?
 */

let t = Int(readLine()!)!
var results = [Int]()
for _ in 0..<t {
    let _ = readLine()!.split(separator: " ").map{ Int(String($0))! }
    let a = readLine()!.split(separator: " ").map{ Int(String($0))! }
    let b = readLine()!.split(separator: " ").map{ Int(String($0))! }.sorted()
    var answer = 0

    a.forEach { element in
        if element > b.last! {
            answer += b.count
        }else if element <= b.first! {
            answer += 0
        }else {
            let bigger = b.firstIndex{ element <= $0 }!
            answer += bigger
        }
    }
    results.append(answer)
}
results.forEach{
    print($0)
}

 

 

 

728x90