문제6

우아한테크코스에서는 교육생(이하 크루) 간 소통 시 닉네임을 사용합니다. 간혹 비슷한 닉네임을 정하는 경우가 있는데, 이러할 경우 소통할 때 혼란을 불러일으킬 수 있습니다.

스크린샷 2019-11-10 오후 11 32 12

혼란을 막기 위해 크루들의 닉네임 중 같은 글자가 연속적으로 포함 될 경우 해당 닉네임 사용을 제한하려 합니다. 이를 위해 같은 글자가 연속적으로 포함되는 닉네임을 신청한 크루들에게 알려주는 시스템을 만들려고 합니다.
신청받은 닉네임 중 같은 글자가 연속적으로 포함 되는 닉네임을 작성한 지원자의 이메일 목록을 return 하도록 solution 메서드를 완성해주세요.
제한사항

  • 두 글자 이상의 문자가 연속적으로 순서에 맞추어 포함되어 있는 경우 중복으로 간주합니다.
  • 크루는 1명 이상 10,000명 이하입니다.
  • 이메일은 이메일 형식에 부합하며, 전체 길이는 11자 이상 20자 미만입니다.
  • 신청할 수 있는 이메일은 email.com 도메인으로만 주어집니다.
  • 닉네임은 한글만 가능하고 전체 길이는 1자 이상 20자 미만입니다.
  • result는 이메일에 해당하는 부분의 문자열을 오름차순으로 정렬하고 중복은 제거합니다.

스크린샷 2019-11-10 오후 11 34 17

forms에는 5명의 크루가 신청서를 작성하였고 이 중 jason@email.comjm@email.com, mj@email.com 크루가 중복 닉네임 대상으로 뽑혔습니다. 따라서 이 세 크루의 이메일을 출력합니다.

풀이

package beautifultask;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class NickName {


    public static String[] solution(String[][] forms){

        String[] answer = new String[forms.length];

        HashSet<String> emails = new HashSet<>();

        final Map<String, String > hashMap = new HashMap<>();

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

            final String name = forms[i][1];

            if(name.length() < 2){
                break;
            }


            for (int j = 0; j < name.length() - 1; j++) {
                final String key = name.substring(j, j+2);
                if(hashMap.containsKey(key)){
                    final String email = hashMap.get(key);
                    if(!email.equals(forms[i][0])){
                        emails.add(email);
                        emails.add(forms[i][0]);
                    }
                }
                hashMap.put(key, forms[i][0]);
            }
        }

        final List<String> collect = emails.stream()
                .sorted()
                .collect(Collectors.toList());
                   //List size가 인자로 넘어가는 배열 객체의 size 보다 클때, 해당 List의 size로 배열이 만들어집니다.
            //반대로 해당 List size가 인자로 넘어가는 배열객체의 size 보다 작을때는, 인자로 넘어가는 배열객체의 size로 배열이 만들어집니다.
        final String[] results = collect.toArray(new String[0]);

        return results;
    }

    public static void main(String[] args) {


        String[][] forms ={{"jm@email.com", "제이엠"},{"jason@email.com","제이슨"},{"woniee@email.com","워니"},{"mj@email.com","엠제이"},{"nowm@email.com","이제엠"}};


        String[] result = solution(forms);

        for (String value : result)
            System.out.println(value);


    }

}

우아한테스크코스 온라인 코딩 테스트 6번 문제입니다. 후반부 문제이지만 연속된 2자리 닉네임을 체크하는데 많은 고민을 하였습니다. 이 문제는 친구의 풀이를 보고 참조하였습니다.
결국 중복된 2글자가 겹치는 닉네임이 있으면 그 닉네임에 해당되는 이메일들을 가지고 있는 정렬된 문자열 배열을 리턴하는 것이 핀트입니다.

forms라는 2차원 배열에 이메일, 닉네임이 각각 들어있습니다. 저같은 경우에 HashSet, HashMap 클래스를 이용하여 중복체크를 하였습니다.

for (int j = 0; j < name.length() - 1; j++) {
    final String key = name.substring(j, j+2);
    if(hashMap.containsKey(key)){
        final String email = hashMap.get(key);
        if(!email.equals(forms[i][0])){
            emails.add(email);
            emails.add(forms[i][0]);
        }
    }
    hashMap.put(key, forms[i][0]);
}

+ Recent posts