tookunn’s diary

主に競技プログラミング関係

Codeforces Educational Round2 A

問題

codeforces.com
aからzまでの文字(大文字も含む)と1から9までの数字と「,」(カンマ)「.」(コロン)「;」(セミコロン)を含む文字列が与えられる。
与えられた文字列をカンマまたはセミコロンで区切り、数字として表されるものと
それ以外のものに分けてカンマ区切りでそれぞれ出力する。
数字として表現されるものや文字列で表すものが無い場合は「-」を出力する。

注意

区切り文字の後に連続して区切り文字が存在する場合、区切り文字の間には長さ0の文字列があるものとする。
012のように0から始まる文字列や数字に続いて文字列が含まれる場合は数字として表されない。
例)00398 98bb jako456

解法

連続した区切り文字の間に文字列があることが問題文に書いてあるので、
まずカンマで文字列を区切る前に、連続した区切り文字の間に長さ0の文字列を表すのに'_'を使って
うまく文字列を表現しました。
そのあとは数字判定を行ってカンマ区切りでうまく数字として表せるものとそうでないものを
振り分けて出力しました。

import java.util.Scanner;
public class A
{
	public boolean isDelimita(char ch)
	{
		if(ch == ',' || ch == ';')return true;
		return false;
	}

	public boolean isDigit(String s)
	{
		if(s.length() == 0)return false;
		if(s.length() != 1 && s.charAt(0) == '0')return false;
		for(int i = 0;i < s.length();i++)
		{
			if(s.charAt(i) >= '0' &&s.charAt(i) <= '9')continue;
			return false;
		}
		return true;
	}
	public void solve()
	{
		Scanner cin = new Scanner(System.in);
		String S = cin.next();
		StringBuilder sb = new StringBuilder();
		for(int i = 0;i < S.length();i++)
		{
			char c = S.charAt(i);
			if(isDelimita(c) && i + 1 < S.length() && isDelimita(S.charAt(i + 1)))
			{
				sb.append(c);
				sb.append("_");
			}else if(isDelimita(c) && i == S.length() - 1)
			{
				sb.append(c);
				sb.append("_");
			}else
			{
				sb.append(c);
			}
		}
		String[] ss = sb.toString().replace(";",",").split(",");
		StringBuilder strstr = new StringBuilder();
		StringBuilder intint = new StringBuilder();
		for(int i = 0;i < ss.length;i++)
		{
			if(isDigit(ss[i]))
			{
				intint.append(ss[i]);
				intint.append(",");
			}else
			{
				strstr.append(ss[i]);
				strstr.append(",");
			}
		}
		String first = intint.length() > 0 ?intint.toString().substring(0,intint.length() - 1) : "-";
		String second = strstr.length() > 0?strstr.toString().replace("_","").replace("?",","):"-";
		if(!second.equals("-"))second = second.substring(0,second.length() - 1);
		System.out.println(!first.equals("-")?"\""+first+"\"":first);
		System.out.println(!second.equals("-")?"\""+second + "\"":second);
	}
	public static void main(String[] args)
	{
		new A().solve();
	}
}

反省

結構実装するのがうまくいかなくて何回もWAとREを出してしまった。
もうちょっと実装力をつけてミスを減らしたいと思いました。