/*
   * 마지막 음절이 명사형 접미사(등,상..)인지 조사한다.
   */
  public static boolean confirmDNoun(AnalysisOutput output) throws MorphException {

    int strlen = output.getStem().length();
    String d = output.getStem().substring(strlen - 1);
    if (!DNouns.contains(d)) return false;

    String s = output.getStem().substring(0, strlen - 1);
    output.setNsfx(d);
    output.setStem(s);

    WordEntry cnoun = DictionaryUtil.getAllNoun(s);
    if (cnoun != null) {
      if (cnoun.getFeature(WordEntry.IDX_NOUN) == '2') output.setCNoun(cnoun.getCompounds());
      else output.setCNoun(Collections.EMPTY_LIST);
      output.setScore(AnalysisOutput.SCORE_CORRECT);
    }

    return true;
  }
  /**
   * 복합명사에서 단위명사를 분리해낸다. 리스트의 가장 마지막에 위치한 단어가 최장단어이다.
   *
   * @param str 복합명사
   * @param pos the analysing start point
   * @param o 분석결과 return 단위명사 리스트
   * @throws MorphException throw exception
   */
  private static List<WordEntry> findNouns(String str, int pos, AnalysisOutput o)
      throws MorphException {

    List<WordEntry> nList = new ArrayList<WordEntry>();

    if (str.length() == 2
        && DictionaryUtil.existSuffix(str.substring(0, 1))
        && DNouns.contains(str.substring(1))) {
      o.setStem(o.getStem().substring(0, o.getStem().length() - 1));
      o.setNsfx(str.substring(1));
      nList.add(new WordEntry(str.substring(0, 1)));
      return nList;
    } else if (str.length() == 2
        && DictionaryUtil.existSuffix(str.substring(0, 1))
        && DictionaryUtil.existJosa(str.substring(1))) {
      return null;
    }

    if (pos >= 2 && DictionaryUtil.existJosa(str)) return null;

    if (str.length() == 1 && (DictionaryUtil.existSuffix(str) || DNouns.contains(str))) {
      nList.add(new WordEntry(str));
      return nList;
    }

    for (int i = 1; i < str.length(); i++) {
      String sub = str.substring(0, i + 1);
      if (!DictionaryUtil.findWithPrefix(sub).hasNext()) break;
      WordEntry entry = DictionaryUtil.getAllNoun(sub);
      if (entry != null) {
        nList.add(entry);
      }
    }

    return nList;
  }