二股に分かれている容器にボールを入れる| アルゴリズム[Ruby/Python/c++] | アルゴリズム [AOJ 0033]


Aizu Online Judge『二股に分かれている容器にボールを入れる』をRuby/Python/C++で解いてみました。
これはどれだけ問題をシンプルに考えられるかという点の思考が必要になるので、難しい戦略を考えるのとは別の思考が必要でおもしろかったです!

🐝 AOJ問題

Aizu Online Judgeの『二股に分かれている容器にボールを入れる』は二股に分かれた容器に番号のついたボールを番号の大小関係の制約を守って並べていく問題です。

🤔 Rubyコード

num = gets.to_i
num.times do
left, right = [], []
arr = gets.chomp.split(' ').map(&:to_i)
arr.each do |a|
if (left.last || 0) < a
left << a
elsif (right.last || 0) < a
right << a
else
break
end
end
puts (arr.size == (left.size + right.size)) ? 'YES' : 'NO'
end

🍮 Pythonコード

n = int(raw_input())
for i in range(n):
left, right = [], []
arr = map(int, raw_input().split(' '))
for a in arr:
if len(left) == 0 or left[len(left)-1] < a:
left.append(a)
elif len(right) == 0 or right[len(right)-1] < a:
right.append(a)
else:
break

if len(arr) == len(left) + len(right):
print 'YES'
else:
print 'NO'

😼 c++コード

#include 
#include

using namespace std;

int a[10];

bool dfs(int i, int left, int right) {
if(i == 10) { return true; }

bool ans = false;
if(left < a[i]) {
ans = dfs(i+1, a[i], right);
}
if(right < a[i]) {
ans = dfs(i+1, left, a[i]);
}
return ans;
}

int main() {
int n;
scanf("%d", &n);

for(int i = 0; i < n; i++) {
for(int j = 0; j < 10; j++) {
scanf("%d", &a[j]);
}
cout << (dfs(0, 0, 0) ? "YES" : "NO") << endl;
}
return 0;
}

🎉 Javaコード

public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
String tmp = br.readLine();
String[] strArray = tmp.split(" ");
List intList = Arrays.asList(strArray).stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList());
ArrayList arr1 = new ArrayList<>();
ArrayList arr2 = new ArrayList<>();

for (Integer item : intList) {
if (arr1.isEmpty() || arr1.get(arr1.size() - 1) < item) {
arr1.add(item);
} else if (arr2.isEmpty() || arr2.get(arr2.size() - 1) < item) {
arr2.add(item);
} else {
break;
}
}

if (arr1.size() + arr2.size() == intList.size()) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
}

😎 GitHubリポジトリ

当面はAOJを解きながら、アルゴリズムの再勉強をしていくつもりです。Ruby/PythonでのAOJの回答は下のリポジトリに保存しておきます。もしツッコミとかあればぜひ。

morizyun/aoj-ruby-python - GitHub

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍