해커랭크 코딩테스트 main함수 돌아보기

HackkerRank에서 알고리즘 테스트를 풀다보면 아래와 같은 기본 코드를 제공을 해줍니다.
다른 알고리즘 사이트(Codlity, Algospot 등등) 에서는 대부분 main함수 또는 구현할 함수만 선언해주는게 전부인거 같더라고요.

main 함수를 보아하니 테스트 케이스 입력과 결과 출력을 자동으로 처리해주기 위해서 제공을 해주는것 같은데
항상 문제풀때 main 함수는 잘 안보고 넘어가서 이번에 한번 어떻게 구현되어있나 한번 봐볼까 합니다.

참고로 문제마다 main함수의 구현내용이 input값에 따라 조금씩 다릅니다.
하지만 기본적으로 Scanner로 입력받고 BufferedWriter로 출력하는건 같은듯

Jumping on the Clouds

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
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Solution {

// Complete the jumpingOnClouds function below.
static int jumpingOnClouds(int[] c) {

}

private static final Scanner scanner = new Scanner(System.in);

public static void main(String[] args) throws IOException {
// 결과값 출력을 위한 BufferedWriter를 생성해서 사용한다
// OUTPUT_PATH에 결과값이 파일로 저장되고 그 파일로 정답 체크를 하는거 같음
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

/**
* 입력값 샘플은 아래와 같다
*
* 7
* 0 0 1 0 0 1 0
*/

// 첫번재 값을 읽어들인다
int n = scanner.nextInt();

/**
* scanner.skip은 매개변수 값으로 패턴을 받는데 해당 패턴과 일치하는 값을 읽어들이면 해당 값은 Skip한다.
* https://www.tutorialspoint.com/java/util/scanner_skip_pattern.htm
* 줄바꿈이나 기타 불필요한 문자가 들어오면 skip 처리 하게끔 하려는 의도 같다.
* (다음줄 받을때 scanner.nextLine() 대신 사용하는듯)
* 상세한 설명은 https://stackoverflow.com/a/52111364
*/
scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

// n크기의 int 배열을 만든다
int[] c = new int[n];

// 다음줄을 받아와 공백으로 잘라 배열에 넣는다.
String[] cItems = scanner.nextLine().split(" ");

//위의 skip함수와 동일
scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

// cItem은 String 배열이므로 다시 int형 배열로 변환(?) 한다.
for (int i = 0; i < n; i++) {
int cItem = Integer.parseInt(cItems[i]);
c[i] = cItem;
}

// 구현할 함수의 매개변수로 배열을 넘겨주고 return 받은 값을 저장한다.
int result = jumpingOnClouds(c);

// result값을 String으로 변환후 bufferedWriter 쓰고
bufferedWriter.write(String.valueOf(result));
// 줄바꿈 처리하고 --> int값 1개만 버퍼에 넣는다면 줄바꿈 처리를 안해도 되지 않을까? (제거하고 실행했을때도 결과 차이는 없음)
bufferedWriter.newLine();
// 버퍼를 닫는다
bufferedWriter.close();

scanner.close();
}
}

scanner.skip을 이용해서 줄바꿈 부분을 처리하는 부분은 처음봤는데요.
대부분 scanner.nextLine()으로 처리하는거 같은데 줄바꿈 외에도 다른 input값에 대한 처리를 완벽하게 해주기 위함인가 싶기도 합니다.

공유하기