[랜덤 마라톤] 선배님 밥 사주세요!(31869)

lhs's avatar
Dec 06, 2024
[랜덤 마라톤] 선배님 밥 사주세요!(31869)
notion image
notion image

1. 문제 풀이 아이디어

  • Map을 사용하여 정보를 저장한 뒤, 필요 없는 정보를 제거하고 남은 데이터를 처리하여 문제를 해결한다.

2. 나의 정답 코드

public class Main { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(bufferedReader.readLine()); Map<String, int[]> map = new HashMap<>(); for (int i = 0; i < n; i++) { StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine()); String s = stringTokenizer.nextToken(); int d = Integer.parseInt(stringTokenizer.nextToken()) * 7 + Integer.parseInt(stringTokenizer.nextToken()); int p = Integer.parseInt(stringTokenizer.nextToken()); map.put(s, new int[]{d, p}); } for (int i = 0; i < n; i++) { StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine()); String s = stringTokenizer.nextToken(); int m = Integer.parseInt(stringTokenizer.nextToken()); if (map.get(s)[1] > m) { map.remove(s); } } List<Integer> list = new ArrayList<>(); for (int[] v : map.values()) { list.add(v[0]); } list.sort(Comparator.naturalOrder()); if (list.isEmpty()) { System.out.println(0); } else { int prev = list.get(0); int count = 1; int result = 1; for (int i = 1; i < list.size(); i++) { if (prev + 1 == list.get(i)) count++; else if (prev == list.get(i)) continue; else count = 1; prev = list.get(i); result = Math.max(result, count); } System.out.println(result); } bufferedReader.close(); } }

3. 정리

  • 처음 입력받은 정보를 Map에 이름과 날짜, 금액으로 저장한다.
  • 이후 입력된 데이터에서 저장된 금액보다 작은 경우 Map에서 제거한다.
  • Map에 남아 있는 값에서 날짜를 추출해 List에 저장한 뒤 정렬한다.
  • List가 비어 있다면 0을 출력하고, 비어 있지 않다면 가장 긴 연속된 날짜의 길이를 계산해 출력한다.

4. 속도 향상

public class Main { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(bufferedReader.readLine()); Map<String, int[]> map = new HashMap<>(); for (int i = 0; i < n; i++) { StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine()); String s = stringTokenizer.nextToken(); int d = Integer.parseInt(stringTokenizer.nextToken()) * 7 + Integer.parseInt(stringTokenizer.nextToken()); int p = Integer.parseInt(stringTokenizer.nextToken()); map.put(s, new int[]{d, p}); } for (int i = 0; i < n; i++) { StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine()); String s = stringTokenizer.nextToken(); int m = Integer.parseInt(stringTokenizer.nextToken()); if (map.get(s)[1] > m) { map.remove(s); } } List<Integer> list = map.values().stream().map(o -> o[0]).distinct().sorted().collect(Collectors.toList()); if (list.isEmpty()) { System.out.println(0); } else { int prev = list.get(0); int count = 1; int result = 1; for (int i = 1; i < list.size(); i++) { if (prev + 1 == list.get(i)) count++; else count = 1; prev = list.get(i); result = Math.max(result, count); } System.out.println(result); } bufferedReader.close(); } }
notion image
  • 스트림을 사용했던 이전 코드
  • 스트림을 사용했더니 속도가 3배 느렸다.
  • 성능을 우선 시 한다면 스트림보단 for문을 써야겠다.
Share article

LHS's Study Space