[프로그래머스] 신고 결과 받기

nayoon·2022년 3월 10일
0

코딩테스트

목록 보기
1/1

오랜만에 풀어도 이렇게 오래 걸릴 문제는 아니었는데, 개인적으로는 많이 아쉽다.

(작년 카카오 코테에서는 깔끔은 아니어도 빨리 풀었던 거 같은데.. 이래서 시간 압박이 중요한가보다..)

내 풀이

import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Arrays;

public class Programmers_신고_결과_받기 {
	
    public static int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        Map<String, Map<String, Boolean>> map = new HashMap<>();
        Map<String, Integer> success = new HashMap<>();
        
        for(String id: id_list) {
        	map.put(id, new HashMap<>());
        	success.put(id, 0);
        }
        StringTokenizer st;
        String reporter, attacker;
        Map<String, Boolean> temp;
        
        for(String rep: report) {
        	st = new StringTokenizer(rep);
        	reporter = st.nextToken();
        	attacker = st.nextToken();
        	
        	temp = map.get(reporter);
        	if (!temp.getOrDefault(attacker, false)) {
	        	temp.put(attacker, true);
	        	
	        	success.put(attacker, success.get(attacker) + 1);
        	}
        	
        }
        
        for(String id: id_list) {
        	if (success.get(id) >= k) {
        		for(int i = 0; i < id_list.length; i++) {
        			if (map.get(id_list[i]).containsKey(id)) answer[i]++;
        		}
        	}
        }
        
        return answer;
    }	
    
	public static void main(String[] args) {
		System.out.println(Arrays.toString(solution(new String[] {"muzi", "frodo", "apeach", "neo"}, new String[] {"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"}, 2)).toString());
		System.out.println(Arrays.toString(solution(new String[] {"con", "ryan"}, new String[] {"ryan con", "ryan con", "ryan con", "ryan con"}, 3)).toString());
	}
}

다른 사람 풀이

다른 사람들 풀이를 보았는데, stream을 이용해서 푼 코드가 가장 상단에 있었고 가장 눈에 띄었다.

다음 문제 조건을 첫 줄부터 처리하고 넘어가는데 멋있었다.

Stream

Java8부터 Stream을 지원하게 되었는데, 컬렉션, 배열 등에 대해 저장되어있는 요소들을 하나씩 참조하며 반복적인 처리를 가능하게 하는 기능이다.

이러한 Stream을 이용한다면 불필요한 for문과 그 안에서의 if문 등의 분기 처리를 쓰지 않고도 깔끔하고 직관적인 코드를 변형할 수 있다.

특징

  1. Stream은 데이터를 읽기만 할 뿐 데이터를 변경하지 않는다.

  2. Stream은 한번 사용하면 닫히기 때문에 재사용이 불가능하다.

  3. Stream을 사용하면 메소드 내부에 반복문을 숨기기 때문에 간결하게 코드를 구성하는 것이 가능하다.

중개 연산

Stream을 전달받아 Stream으로 반환하기 때문에 중개 연산을 연속으로 사용할 수 있다.

최종 연산

중개 연산을 통해 만들어진 stream에 있는 요소들에 대해 마지막으로 각 요소를 소모하며 최종 결과를 표시한다.

즉, 지연(lazy) 되었던 모든 중개 연산들이 최종 연산 시에 모두 수행되는 것이다.

이렇게 최종 연산 시에 모든 요소를 소모한 해당 stream은 더 이상 사용할 수 없다.

https://ahndding.tistory.com/23

위 풀이를 보고 한 생각

개선할 점

  • for문 횟수 줄이기


    굳이 Stream을 사용하지 않아도 Set을 이용해서 중복된 report를 줄일 수 있을 것 같다.

profile
뚜벅뚜벅 열심히 공부하는 개발자

0개의 댓글