문제6
우아한테크코스에서는 교육생(이하 크루) 간 소통 시 닉네임을 사용합니다. 간혹 비슷한 닉네임을 정하는 경우가 있는데, 이러할 경우 소통할 때 혼란을 불러일으킬 수 있습니다.
혼란을 막기 위해 크루들의 닉네임 중 같은 글자가 연속적으로 포함 될 경우 해당 닉네임 사용을 제한하려 합니다. 이를 위해 같은 글자가 연속적으로 포함되는 닉네임을 신청한 크루들에게 알려주는 시스템을 만들려고 합니다.
신청받은 닉네임 중 같은 글자가 연속적으로 포함 되는 닉네임을 작성한 지원자의 이메일 목록을 return 하도록 solution 메서드를 완성해주세요.
제한사항
- 두 글자 이상의 문자가 연속적으로 순서에 맞추어 포함되어 있는 경우 중복으로 간주합니다.
- 크루는 1명 이상 10,000명 이하입니다.
- 이메일은 이메일 형식에 부합하며, 전체 길이는 11자 이상 20자 미만입니다.
- 신청할 수 있는 이메일은 email.com 도메인으로만 주어집니다.
- 닉네임은 한글만 가능하고 전체 길이는 1자 이상 20자 미만입니다.
- result는 이메일에 해당하는 부분의 문자열을 오름차순으로 정렬하고 중복은 제거합니다.
forms에는 5명의 크루가 신청서를 작성하였고 이 중 jason@email.com
과 jm@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]);
}
'알고리즘' 카테고리의 다른 글
Programmers - K번째수 (0) | 2019.12.11 |
---|---|
검색 알고리즘 (이진 검색) (0) | 2019.12.07 |
우아한테스크코스 - 배달앱 (0) | 2019.11.10 |
우아한테스크코스 - 시간대별 로그 횟수 출력하기 (0) | 2019.11.10 |
문자열 - 문자열 내마음대로 정렬하기 (0) | 2019.11.07 |