# 1996. The Number of Weak Characters in the Game

#### Medium

***

You are playing a game that contains multiple characters, and each of the characters has **two** main properties: **attack** and **defense**. You are given a 2D integer array `properties` where `properties[i] = [attacki, defensei]` represents the properties of the `ith` character in the game.

A character is said to be **weak** if any other character has **both** attack and defense levels **strictly greater** than this character's attack and defense levels. More formally, a character `i` is said to be **weak** if there exists another character `j` where `attackj > attacki` and `defensej > defensei`.

Return *the number of **weak** characters*.

&#x20;

**Example 1:**

<pre><code>Input: properties = [[5,5],[6,3],[3,6]]
<strong>Output:
</strong> 0
<strong>Explanation:
</strong> No character has strictly greater attack and defense than the other.
</code></pre>

**Example 2:**

<pre><code>Input: properties = [[2,2],[3,3]]
<strong>Output:
</strong> 1
<strong>Explanation:
</strong> The first character is weak because the second character has a strictly greater attack and defense.
</code></pre>

**Example 3:**

<pre><code>Input: properties = [[1,5],[10,4],[4,3]]
<strong>Output:
</strong> 1
<strong>Explanation:
</strong> The third character is weak because the second character has a strictly greater attack and defense.
</code></pre>

&#x20;

**Constraints:**

* `2 <= properties.length <= 105`
* `properties[i].length == 2`
* `1 <= attacki, defensei <= 105`

```python
from functools import cmp_to_key
class Solution:
    def numberOfWeakCharacters(self, properties: List[List[int]]) -> int:
        properties.sort(key=lambda x: (-x[0],x[1]))
        count = 0
        curr_max = 0
        for _, d in properties:
            if d < curr_max:
                count += 1
            else:
                curr_max = d
        return count
```
