#include <bits/stdc++.h>

using namespace std;
#define all(x) (x).begin(),(x).end()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define chmin(x, y) (x) = min((x), (y))
#define chmax(x, y) (x) = max((x), (y))
#define endl "\n"
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {os << "["; for (const auto &v : vec) {os << v << ","; } os << "]"; return os;}
template <typename T, typename U> ostream &operator<<(ostream &os, const pair<T, U> &p) {os << "(" << p.first << ", " << p.second << ")"; return os;}

const int mod = 1e9 + 7;

int solve1(int N, string &S) {

    // dp[i][j] := 最後に選んだ要素より小さい要素がi個、大きい要素がj個まだ残っている場合の数
    vector<vector<int>> dp(N, vector<int>(N));
    for (int i = 0; i < N; i++) {
        dp[i][N - i - 1] = 1;
    }
    for (int s = N - 1; s >= 0; s--) {
        for (int i = 0; s - i >= 0; i++) {
            int j = s - i;
            int k = N - 1 - s;
            if (S[k] == '<') {
                for (int l = 0; j - 1 - l >= 0; l++) {
                    dp[i + l][j - 1 - l] += dp[i][j];
                    dp[i + l][j - 1 - l] %= mod;
                }
            } else {
                for (int l = 0; i - 1 - l >= 0; l++) {
                    dp[i - 1 - l][j + l] += dp[i][j];
                    dp[i - 1 - l][j + l] %= mod;
                }
            }
        }
    }

    return dp[0][0];
}

int solve2(int N, string &S) {

    // dp[i][j] := 今までi個選んだ時、最後に選んだ要素より小さい要素がまだj個残っている場合の数    
    vector<vector<int>> dp(N + 1, vector<int>(N));
    for (int j = 0; j < N; j++) {
        dp[1][j] = 1;
    }

    for(int i = 1; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (S[i - 1] == '<') {
                for (int l = j; l < N - i; l++) {
                    dp[i + 1][l] += dp[i][j];
                    dp[i + 1][l] %= mod;
                }
            } else {
                for (int l = j - 1; l >= 0; l--) {
                    dp[i + 1][l] += dp[i][j];
                    dp[i + 1][l] %= mod;
                }
            }
        }
    }
    return dp[N][0];
}

int solve3(int N, string &S) {

    // dp[i][j] := 今までi個選んだ時、最後に選んだ要素より小さい要素がまだj個残っている場合の数    
    vector<vector<int>> dp(N + 1, vector<int>(N));
    for (int j = 0; j < N; j++) {
        dp[1][j] = 1;
    }

    for(int i = 1; i < N; i++) {
        for (int j = 0; j < N; j++) {

            // いもす法を用いて高速に範囲加算
            if (S[i - 1] == '<') {
                dp[i + 1][j] += dp[i][j];
                dp[i + 1][j] %= mod;
                dp[i + 1][N - i] += mod - dp[i][j];
                dp[i + 1][N - i] %= mod;
            } else {
                dp[i + 1][0] += dp[i][j];
                dp[i + 1][0] %= mod;
                dp[i + 1][j] += mod - dp[i][j];
                dp[i + 1][j] %= mod;
            }
        }
        // 累積和計算
        int sum = 0;
        for (int j = 0; j < N; j++) {
            sum += dp[i + 1][j];
            sum %= mod;
            dp[i + 1][j] = sum;
        }
    }
    return dp[N][0];
}

int main() {
    #ifdef LOCAL_ENV
    std::cin.exceptions(std::ios::failbit);
    #endif
    std::cin.tie(0);
    std::ios::sync_with_stdio(false);
    cout.setf(ios::fixed);
    cout.precision(16);

    int N; string S;
    cin >> N >> S;

    // cout << solve1(N, S) << endl;
    // cout << solve2(N, S) << endl;
    cout << solve3(N, S) << endl;

    return 0;
}

Measured memory_bytes: 35584