二股に分かれている容器にボールを入れる| アルゴリズム[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 <iostream>
#include <stdio.h>
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<Integer> intList = Arrays.asList(strArray).stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList());
ArrayList<Integer> arr1 = new ArrayList<>();
ArrayList<Integer> 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

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)