2023.08.22 - 알고리즘

mjjin·2023년 8월 21일
0

알고리즘

출처 : 프로그래머스

문자열 내 마음대로 정렬하기

import java.util.Arrays;
class Solution {
    public String[] solution(String[] strings, int n) {
        return Arrays.stream(strings).sorted().sorted((s1, s2) -> s1.charAt(n) - s2.charAt(n)).toArray(String[]::new);
    }
}

중간 인덱스 값의 문자열이 같을 땐, 사전순으로 정렬해야 할 것을 대비해서
먼저 정렬 해준 후 n번째 인덱스에 있는 아스키값을 이용해 정렬하고
toArray로 스트링 배열을 만들어 바로 return했다.
쉬웠다.

신고 결과 받기

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        
        // 아이디, 신고당한 횟수 저장용 Map / 아이디별 메일 보낼 횟수 저장용 Map 생성
        Map<String, Integer> idList = new HashMap<>();
        Map<String, Integer> reportUser = new HashMap<>();
        
        // 생성한 Map Key값 = id_list / Value 값 = 0으로 초기화
        for (var i: id_list) {
            idList.put(i,0);
            reportUser.put(i,0);
        }
        // 중복제거하기 ex) "ryan con", "ryan con" ... -> "ryan con"
        List<String> reportlist = Arrays.stream(report).distinct().collect(Collectors.toList());
        
        // 신고당한 횟수 저장
        for (var i : reportlist) {
            String[] s = i.split(" ");
            reportUser.put(s[1], reportUser.get(s[1]) +1);
        }
        
        // 신고횟수 (value)값이 k 이상일 경우에만 메일 보낼횟수 +1
        for (var i : reportlist) {
            String[] str = i.split(" ");
            if(reportUser.get(str[1]) >= k) {
                idList.put(str[0], idList.get(str[0]) +1);
            }
        }
        
        //int[]로 반환하기 위해 배열 생성
        int[] answer = new int[id_list.length];
        
        // Map 순서보장 X 처음 받은 id_list의 순서에 맞게 value값 넣기 
        for (int i = 0; i < id_list.length; i++) {
            answer[i] = idList.get(id_list[i]);
        }
        return answer;
    }
}

스트림을 배우고 나서 당당하게 알고리즘으로 스트림 연습하겠다는 당찬 포부와는 달리
정작 스트림 쓴 건 중복 제거하는 한 줄이 다였다.
..이게 맞나..!
심지어 리스트로 만드는 과정을 IDEA에서 작업할 때에는
List<String> reportlist = Arrays.stream(report).distinct().toList();
로 썼었는데,
막상 코드를 제출하려고 하니
계속 오류가 나길래 예전에 썼었던 스트림을 리스트로 만드는 방법으로 시도했더니
잘 넘어갔다.

자바 버전 차이인지 한 번 알아봐야겠다.

0개의 댓글