문제 본문이 굉장히 긴편인데, 한눈에 들어오지도 않아 요구하는 바가 무엇인지 바로 파악하기가 힘들었다.

문제의 요구사항으로는

  • 문자열에 대해 각 문자로 만들 수 있는 문자열 조합 도출
  • 문자열 조합에 대한 갯수 도출
  • 가장 많이 나온 조합에 대해 알파벳 순으로 출력

비교적 쉬운 수준으로 보이나, 위에서 말했다싶이 문제 본문을 읽고 바로 요구사항이 떠오르질 않는다…

문제 해결을 위해서 좀 더 풀어서 써보자면…

  1. 입력으로 받은 각 손님 별 주문 (문자열) 에 대해 부분 문자열 조합 생성
  2. 각 부분 문자열에 대한 카운트 저장 및 업데이트
  3. 목표 코스 크기 (int) 에 대해 가장 많이 호출된 부분 문자열 찾기
  4. 결과 반환을 위해 알파벳 순으로 정렬

정도로 문자열에 대해 목표 크기에 맞는 부분 문자열 조합을 생성 후

추후 목표 크기에 대한 문자열 조합 갯수 비교를 위해, 저장

결과 반환을 위해 도출한 부분 문자열 정렬 후 반환을 해야한다.


코드 설명

풀이 작성시 핵심이 되는 부분 문자열 생성메소드 부분이다.

public void create(String str, int cnt, int target, int idx, char[] order) {
    // 목표 길이에 맞는지 확인		
    if (cnt == target) {
        // 결과로 나온 부분 문자열 내부를 알파벳 순에 맞춰 정렬하여 반환 
        char[] foods = courseOrderingByAlphabet(str);			
        // 정렬을 위해 char[] 로 나온 결과를 다시 스트링 값으로 변경
        String newCourse = createCourseName(foods);
        // 부분 문자열 마다 카운팅을 위해, map객체에 저장.
        int courseCnt = map.getOrDefault(newCourse, 0) + 1;			
        map.put(newCourse, courseCnt);
        // 각 코스별 가장 많이 호출된 갯수 저장을 위해 저장.
        isMostFavoriteCourse(courseCnt, target);
        return;		
    }
    // 입력 문자열에 대해 순차적으로 더하여 부분 문자열 생성하며 진행
    for (int i = idx; i < order.length; i++) {			
        char food = order[i];			
        create(str + food, cnt + 1, target, i + 1, order);		
    }	
}

문자열을 인덱스로 순회하며 문자열의 부분 문자열을 생성하는데, 깔끔하게 메소드를 만들지 못해 아쉽다.

한 눈에 들어오는 편이 아니기 때문에 추가적인 설명을 남긴다.

입력 문자열 예시로 ABCDE 라는 문자열이 들어오고

목표 부분 문자열 크기로 2 라고 하자.

해당 메소드로 처리를 위해, ABCDE 문자열을 index로 순회하며 메소드를 호출하게 된다.

메소드의 파라미터를 여기서 정하였는데

str - 생성할 부분 문자열

cnt - 부분 문자열 크기

targert - 목표 부분 문자열크기

idx - 입력 문자열에 대한 index 로 각 문자별 생성을 위해 입력받음

order - 전체 문자열 char[]

보다 싶이 파라미터로 받는 변수가 많아, 정확히 어떤 값을 어떻게 처리하는지 바로 파악하는데 어려움이 따른다…

나중엔 이러지 말자…

이후 들어온 문자열을 시작점부터 시작하여 부분 문자열을 생성한다.

재귀 호출을 통해 생성하는데, 스트링 연산시 새로운 인스턴스가 새롭게 생성되므로

첫 문자 A -> 두번째 B

첫 문자 A -> 두번째 C

와 같은 순서로 생성되어 문자열에 대한 부분 문자열을 생성하게 된다.

문자열 크기가 목표 크기에 다다르게 되면, 해당 문자열을 각 문자로 분해후 정렬하여

결과 도출시 문제가 없도록 한 후, 각 문자별 카운팅을 위해 저장한다.

마음에 안드는 부분 투성이지만 여기까지…


참조