

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();
}
}

- 스트림을 사용했던 이전 코드
- 스트림을 사용했더니 속도가 3배 느렸다.
- 성능을 우선 시 한다면 스트림보단 for문을 써야겠다.
Share article