정리 못하는 정리베

문제

알고스팟 새싹 콘테스트를 준비하느라 정신이 없던 정리베는, 버벅거리는 컴퓨터의 원인이 가득 찬 하드디스크라는 것을 알게 되었습니다. 하드의 파일들을 확인해본 후, 정리베는 두 가지 사실을 발견했습니다.

  • 하드 용량의 대부분을 MP3파일이 차지한다.
  • MP3파일 중에 중복되는 파일이 존재한다.

따라서 정리베는 MP3파일들을 정리하여 하드 공간을 어느 정도 더 확보할 수 있는지 알아보려고 합니다.

모든 MP3파일의 이름은 다음과 같은 형식으로 쓰여집니다. 이를 통해 MP3파일에 해당하는 아티스트 명과 곡의 제목을 알 수 있으며, 아티스트 명과 곡의 제목이 같을 경우 이를 동일한 곡으로 간주합니다.

  • (트랙 번호)(아티스트 명)(곡 제목).mp3
  • (트랙 번호). (아티스트 명) - (곡 제목).mp3
  • (아티스트 명) - (곡 제목).mp3
  • (아티스트 명)_(곡 제목).mp3

(트랙 번호)는 0부터 9까지의 숫자 조합으로 이루어지고, (아티스트 명)과 (곡 제목)은 공백, 숫자, 영문자 그리고 여는 괄호 ’(‘와 닫는 괄호 ’)’ 문자의 조합으로 이뤄집니다. 모든 파일은 위 4가지 중 한 가지 형식으로만 해석될 수 있습니다. (아티스트 명)과 (곡 제목) 비교시에 알파벳 대소문자는 구분하지 않습니다.

입력

입력의 첫 줄에는 곡의 개수 N이 입력됩니다. 그 후 N줄에 각각 파일의 경로가 주어지는데, 형식은 다음과 같습니다.

  • (파일명)
  • /(폴더1)/(폴더2)/…/(파일명)

2번째 형식의 경우 중첩된 폴더 구조에 위치한 파일을 의미합니다.

출력

한 줄에 중복을 모두 제외한 곡의 개수를 출력합니다.

입력 파일

A1.txt A2.txt

제약 조건

예제 입력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
9
Above and Beyond Feat Zoe Johnston - Alchemy (Above and Beyond Club Mix).mp3
Coldplay - Every Teardrop Is A Waterfall (Swedish House Mafia Remix).mp3
/Andrew Rayel/Armin Van Buuren - Serenity (Andrew Rayel Aether Remix).mp3
Armin Van Buuren - Serenity (Andrew Rayel Aether Remix).mp3
/Above and Beyond Feat Zoe Johnston - Alchemy/Above and Beyond Feat Zoe Johnston - Alchemy (Above and Beyond Club Mix).mp3
Nuera - Transatlantic 2009 (Original Mix).mp3
/Discograph/Nuera/Nuera - Transatlantic 2011 (Original Mix).mp3
/Alex M O R P H - Eternal Flame (Alex M O R P H s Reach Out For The Stars Mix).mp3
01. Armin Van Buuren Feat Fiora - Waiting For The Night (Radio Edit).mp3

예제 출력

1
7

Source Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.sarojaba.algospot.newbie;
import java.io.File;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class A {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(new File("a.txt"));
int N = scanner.nextInt();
String[] lines = new String[N];
for (int i = 0; i < N; i++) {
lines[i] = scanner.nextLine();
}
System.out.println(solve(lines));
scanner.close();
}
public static int solve(String[] lines) {
Set mp3s = new HashSet<>();
Pattern pattern = Pattern.compile("(?:/.*)*/(.*)");
for (String l : lines) {
Matcher matcher = pattern.matcher(l);
String f = l;
if (matcher.matches()) {
f = matcher.group(1);
}
mp3s.add(MP3.parse(f));
}
return mp3s.size();
}
}
class MP3 {
private String artist;
private String song;
private int track;
public MP3(String artist, String song) {
this(artist, song, 0);
}
public MP3(String artist, String song, int track) {
this.artist = artist;
this.song = song;
this.track = track;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof MP3)) {
return false;
}
MP3 mp3 = (MP3) obj;
if (!artist.equalsIgnoreCase(mp3.artist)) {
return false;
}
if (!song.equalsIgnoreCase(mp3.song)) {
return false;
}
return true;
}
@Override
public int hashCode() {
return (artist.toLowerCase().hashCode() + song.toLowerCase().hashCode())
% Integer.MAX_VALUE;
}
@Override
public String toString() {
return String.format("{artist: %s, song: %s}", artist, song);
}
public static MP3 parse(String file) {
Pattern[] patterns = new Pattern[2];
patterns[0] = Pattern.compile("(.*)_(.*)_(.*)\\.mp3");
patterns[1] = Pattern.compile("(.*)\\. (.*) - (.*)\\.mp3");
for (Pattern p : patterns) {
Matcher matcher = p.matcher(file);
if (matcher.matches()) {
try {
int track = Integer.parseInt(matcher.group(1));
String artist = matcher.group(2);
String song = matcher.group(3);
return new MP3(artist, song, track);
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
patterns[0] = Pattern.compile("(.*) - (.*)\\.mp3");
patterns[1] = Pattern.compile("(.*)_(.*)\\.mp3");
for (Pattern p : patterns) {
Matcher matcher = p.matcher(file);
if (matcher.matches()) {
String artist = matcher.group(1);
String song = matcher.group(2);
return new MP3(artist, song);
}
}
return null;
}
}
Share Comments