-
Notifications
You must be signed in to change notification settings - Fork 174
Expand file tree
/
Copy pathBaseballNumber.java
More file actions
77 lines (62 loc) · 2.06 KB
/
BaseballNumber.java
File metadata and controls
77 lines (62 loc) · 2.06 KB
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
package baseball.model;
import java.util.*;
public class BaseballNumber {
static final int LENGTH = 3;
private final List<Integer> digits;
private BaseballNumber(List<Integer> digits) {
this.digits = List.copyOf(digits);
}
public static BaseballNumber fromString(String raw) {
String input = raw.trim();
validate(input);
List<Integer> digits = new ArrayList<>();
for (char c : input.toCharArray()) {
digits.add(c - '0');
}
return new BaseballNumber(digits);
}
public static BaseballNumber random() {
List<Integer> pool = new ArrayList<>();
for (int i = 1; i <= 9; i++) {
pool.add(i);
}
Collections.shuffle(pool);
return new BaseballNumber(pool.subList(0, LENGTH));
}
private static void validate(String input) {
validateLength(input);
validateElements(input);
}
private static void validateLength(String input) {
if (input.length() != LENGTH) {
throw new IllegalArgumentException("입력 숫자는 " + LENGTH + "자리여야 합니다.");
}
}
private static void validateElements(String input) {
Set<Character> uniqueChars = new HashSet<>();
for (char c : input.toCharArray()) {
validateRange(c);
validateUniqueness(uniqueChars, c);
uniqueChars.add(c);
}
}
private static void validateRange(char c) {
if (c < '1' || c > '9') {
throw new IllegalArgumentException("1 에서 9 사이의 숫자만 입력 가능합니다.");
}
}
private static void validateUniqueness(Set<Character> uniqueChars, char c) {
if (uniqueChars.contains(c)) {
throw new IllegalArgumentException("중복되지 않은 숫자여야 합니다.");
}
}
public int size() {
return digits.size();
}
public int digitAt(int index) {
return digits.get(index);
}
public boolean contains(int digit) {
return digits.contains(digit);
}
}