CodeWars 서른 다섯 번째 문제

Updated:

Your order, please

public static String order(String words) {

		String[] splitWords = words.split(" ");
		String[] sortWords = new String[splitWords.length];

		for (int i = 0; i < splitWords.length; i++) {

			sortWords[i] = findWord(i + 1, splitWords);
		}

		return String.join(" ", sortWords);
	}

private static String findWord(int i, String[] splitWords) {

    for (int j = 0; j < splitWords.length; j++) {
        if (splitWords[j].contains(String.valueOf(i))) {
            return splitWords[j];
        }
    }

    return "";
}
  • 나의 머리로는 이중 반복문을 아니면 풀 수 없다고 생각했다.

  • 숫자 1,2,3,4 순으로 split한 Stirng 배열을 순환하면서 해당하는 단어를 새로 만든 String 배열에 넣는 방식으로 생각했다.

  • 하지만 역시… 하나의 반복문으로 해결 가능했다. 그것이 바로 아래 Best 코드이다.

    public static String order(String words) {
    	if (words == "")
    		return words;
    	String newWords[] = new String[words.split(" ").length];
    	for (String word : words.split(" ")) {
    		int index = Integer.valueOf(word.replaceAll("[^0-9]", "")) - 1;
    		newWords[index] = word;
    	}
    	return String.join(" ", newWords);
    }
    
  • split한 String 배열을 딱 한 번 순환한다. 이때 단어에 포함된 숫자가 바로 index 값이다.(정확히는 -1)

  • [^0-9] 정규식을 통해서 숫자를 제외한 나머지는 ““처리하고 word에서 나오는 숫자에 -1을 하면 newWords에 들어가는 index 값인데 거기에 word를 넣는다.
  • 캬… 기가막힌 코드였다.. 나도 생각 조금 더했음 이렇게 풀었을것이다… 풀었을까?