입력값인 방번호를 String 타입으로 저장한다.
크기가 10인 int형 배열을 선언 및 초기화한다.
String 타입으로 저장한 방번호를 toCharArray() 메서드를 사용해서 문자 배열로 만들어준다.
그 배열을 반복문을 돌면서 (해당 문자 - '0')으로 int로 바꿔준다.
처음에 선언한 int형 배열에 해당하는 index의 배열 값을 +1 해준다.
이때, 6과 9는 뒤집어서 사용할 수 있기 때문에 9는 없는 값이라고 치고 9를 사용해도 인덱스 6에 해당하는 배열 값을 +1 해준다.
반복문을 다 돌고나서, 인덱스 6인 부분은 2로 나누어준다. 이때, 홀수번 사용된 경우가 있을 수 있으니 나머지값을 더해준다.
위 과정이 끝나면 오름 차순으로 정렬 후 제일 큰 값(인덱스 9)을 출력해준다.
package BOJ;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class sol1475 {
static int[] nums;
static String roomNo;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
roomNo = br.readLine();
nums = new int[10];
for (char c : roomNo.toCharArray()) {
int idx = c - '0';
if (idx == 9) {
idx = 6;
}
nums[idx]++;
}
nums[6] = nums[6] / 2 + nums[6] % 2;
Arrays.sort(nums);
System.out.println(nums[9]);
}
}
int idx = c - '0';
이 코드를 보면 char - '0'으로 문자를 정수로 변환한다. 이 방법이 가능한 이유는 0~9는 아스키코드로 48~57에 해당한다. 따라서 '3'의 경우 51을 의미하고 '0'은 48을 의미하기 때문에 '3'-'0'은 int형 3이 된다.
위 메서드를 사용하여 배열을 정렬하면 기본적으로 오름차순으로 정렬된다.
DualPivotQuicksort 방식을 사용하여 평균 O(nlog(n)), 최악 O(n^2)의 시간 복잡도를 가진다.
참고: 이 문제에서처럼 배열을 정렬하는 경우, Arrays.sort() 메서드를 사용하고, List, Set을 정렬하는 경우에는 Collections.sort()를 사용한다. Collections.sort()는 TimeSort를 사용하여 평균, 최악 모두 O(nlogn)의 시간복잡도를 가진다.