개요
요즘에는 알고리즘 문제풀이 연습에 시간을 많이 할애하고 있습니다. 한동안 연습을 등한시했더니, 완전 기초적인 지식도 헷갈려서 골치 아프네요. 특히나 언어를 Java로 바꾸면서 언어적 특성도 같이 공부하느라 더 머리가 아픕니다.
아무튼, 저는 백준과 프로그래머스 두 플랫폼을 주로 사용하고 있습니다. 개인적으로, 프로그래머스 문제들은 문제 자체를 이해하는 능력과 구현 능력이 필요한 스타일이라면, 백준 문제들은 대부분 알고리즘 자체에 대한 이해를 필요로 하는 스타일이라고 느낍니다. 그래서 둘 다 골고루 많이 연습해 보는 게 좋은 것 같습니다.
두 플랫폼간의 큰 차이점이 한 가지 더 있습니다. 문제에 대한 테스트케이스 데이터 입력 방식이 다르다는 점인데요.
프로그래머스 방식은 데이터 입력을 함수의 매개변수로 넘겨받도록 코드를 작성해야 합니다. 그래서 IntelliJ 같은 별도의 IDE를 사용해서 코드를 작성하고 디버깅할 때도, 입력해 줄 값을 한 번만 작성해 놓으면 돼서 매번 입력값을 타이핑할 필요가 없습니다.
그런데 백준 방식은 데이터 입력을 매번 콘솔로 타이핑해야 하는 방식입니다. 그래서 디버깅을 해야 하는 상황이 오면 매번 수동으로 데이터를 입력해주는게 여간 귀찮은 일이 아닐 수 없습니다. (오타를 신경 써야 하는 것도 매우 불편합니다)
고민
그래서 좀 더 편하게 문제풀이를 할 수 있는 방법이 없을까 싶었습니다.
이미 많은 개발자들이 이 부분에 대한 불편함을 느꼈을 것 같은데, 당연히 이미 존재하는 개선안들이 있을 것이라고 생각했죠.
---
오픈소스 프로젝트
https://github.com/PENEKhun/baekjoon-java-starter
GitHub - PENEKhun/baekjoon-java-starter: 자바를 이용하여 백준 문제를 풀 때 프로젝트 생성 및 주어진 예
자바를 이용하여 백준 문제를 풀 때 프로젝트 생성 및 주어진 예시 입출력에 대한 자동 검증을 도와주는 프로그램입니다. 여러분은 이제 문제 풀이에만 집중하세요. - PENEKhun/baekjoon-java-starter
github.com
위 오픈소스 프로젝트는 백준 문제 페이지를 크롤링해서, 입력한 문제 페이지에 작성되어 있는 예시 입력값을 가져와서 자동으로 실행까지 시켜주도록 만들었다고 합니다. 아주 깔끔하게 잘 만든 것 같습니다.
그래서 처음에는 이 프로젝트를 한번 활용해볼까 싶었는데, 다음 이유들 때문에 사용하지 않았습니다.
- 백준 페이지에 등록되어 있는 입력값이 아닌 다른 입력값을 사용하려면 결국 수동으로 타이핑을 해줘야 한다.
- 특정 도구를 추가로 설치하고, 사용법을 별도로 익혀야 할 정도라면(간단할지라도) 굳이 사용하고 싶지 않았다.
예시로 소개해드린 프로젝트 말고도, 비슷한 프로젝트가 여러개 더 있는 것으로 보이니 한번 찾아보고 사용해 보는 것도 좋을 것 같습니다.
---
예제 입력 템플릿
그래서, 프로그래머스 방식으로 문제를 풀 때 처럼 딱 한번만 입력값을 직접 작성해놓기만 하면 계속 사용할 수 있도록 만들어서 사용하면 좋을 것 같다는 생각이 들었습니다. 그리고 최대한 간단하게 만드는 것이 목표였습니다.
- `TestCaseInputBuilder.java`
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class TestCaseInputBuilder {
private final StringBuilder stringBuilder = new StringBuilder();
public TestCaseInputBuilder inputLine(String text) {
stringBuilder.append(text).append("\n");
return this;
}
public void run(String[] args) throws IOException {
inputStringToSystem(); // 콘솔 입력 수행
Main.main(args); // 문제풀이 코드 실행
stringBuilder.setLength(0); // StringBuilder 초기화
System.out.println("==============");
}
private void inputStringToSystem() {
System.setIn(new ByteArrayInputStream(getBytesForSystemSetIn()));
}
private byte[] getBytesForSystemSetIn() {
return stringBuilder.toString().getBytes();
}
}
백준에 문제를 제출할 때는 반드시 class 명을 `Main` 으로 해야 하고,
구현 코드는 `public static void main(String[] args) {}` 메서드에 작성해야 한다는 제약사항이 있다는 점을 이용해서 작성한 코드입니다.
메서드 체이닝 방식으로 input을 입력할 수 있게 했고, 한번 실행에 여러 개의 테스트 케이스를 수행할 수 있도록 했습니다.
다음은 사용 예시입니다.
- `BOJRunner.java`
import java.io.IOException;
public class BOJRunner {
public static void main(String[] args) throws IOException {
TestCaseInputBuilder input = new TestCaseInputBuilder();
// 예제 1)
input.inputLine("4 5 1")
.inputLine("1 2")
.inputLine("1 3")
.inputLine("1 4")
.inputLine("2 4")
.inputLine("3 4")
.run(args);
// 예제 2)
input.inputLine("5 5 3")
.inputLine("5 4")
.inputLine("5 2")
.inputLine("1 2")
.inputLine("3 4")
.inputLine("3 1")
.run(args);
}
}
위 코드를 `Main.java` 에 작성하지 않고, 문제에 대한 실행과 데이터 입력만을 담당하는 클래스를 분리해서 실행하도록 하는 것이 포인트입니다. 이렇게 분리해 놓으면, `Main.java` 코드에는 문제 제출 페이지에 제출할 코드만이 남아있게 되어 보기도 편하고 복붙 하기도 편합니다.
최종적으로 위 클래스를 실행하면, 콘솔에 다음과 같이 실행 결과가 나타납니다.
---
결과적으로, 제 문제풀이 환경은 다음과 같은 구조로 구성되어 있습니다.
`BOJRunner.java`에 입력할 테스트 값을 세팅해 놓고, `Main.java` 에 문제 풀이 코드를 작성하고, 그 코드를 통째로 복사해서 백준 사이트에 제출하는 방법으로 사용 중입니다.
'Algorithm(PS)' 카테고리의 다른 글
[프로그래머스/python] 소수 만들기 (0) | 2022.07.27 |
---|---|
[Algorithm] 재귀(Recursion) (0) | 2022.07.25 |
[백준-Python] 문제 1417 - 국회의원 선거 (0) | 2022.07.20 |
[백준-Python] 문제 14888 - 연산자 끼워넣기 (0) | 2022.07.05 |
[백준/Python] 문제 15654 - N과 M (5) (0) | 2022.07.03 |