けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 299 A - Treasure Chest (灰色, 100 点)

3 重の for 文を書くのが楽だと思う

問題概要

3 種類の文字 .|* からなる、長さ  N の文字列  S が与えられる。  S には | がちょうど 2 つ、* がちょうど 1 つ含まれる。

* が 2 つの | に挟まれているかどうかを判定せよ。

考えたこと

色々な解法がある。一番楽なのは次のように解釈することだと思う。


文字列  S i, j, k 番目の 3 個の文字であって、

  •  i \lt j \lt k
  • S[i] = |
  • S[j] = *
  • S[k] = |

であるような組が存在するかどうかを判定せよ。


このように解釈すると 3 重 for 文で解ける。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    string S;
    cin >> N >> S;
    
    bool res = false;
    for (int i = 0; i < N; ++i) {
        for (int j = i+1; j < N; ++j) {
            for (int k = j+1; k < N; ++k) {
                if (S[i] == '|' && S[j] == '*' && S[k] == '|') res = true;
            }
        }
    }
    if (res) cout << "in" << endl;
    else cout << "out" << endl;
}