안녕하세요. 모의 코딩테스트 출제하고 있느라 블로그를 오랫동안 비웠습니다. 출제를 하다 보면, 데이터 인풋에 대해서 결과를 파일로 떨어트려야 하는 경우가 매우 빈번한데요. 저는 여태까지 그냥 코드 내에서 파일을 열고 닫는 식으로 코드를 작성했어요. 그런데 이게 솔루션 파일이 1 ~ 2개면 모르겠는데 여러 개였습니다. 검증용 코드까지 합하면 상당히 많았는데요. 얘네들을 하나 하나 코드를 열어서 파일을 열고 파일로부터 입력 받는 로직으로 수정하고. 그럴 수는 없었어요. 그래서 리다이렉션으로 처리하게 되었고요. 그런데 윈도우의 powershell에서는 쉽지 않더라고요.

 

 제가 당장 급하게 썼던 방법하고, 나중에 스택 오버플로우 등에서 천천히 찾아보았던 방법을 소개해 드리겠습니다.

 


 

 먼저 제 코딩테스트 2회에 출제되었던 가희와 btd5 2 정해 코드의 일부입니다. 이상한 점은 fscanf가 들어갔고, 뭔가 열고 닫는 게 들어갔다는 것인데요. 사실, 파일 입출력을 위해서 제가 따로 파일로부터 읽는 프로그램을 만들었었습니다.

 

 

 컴파일 해서 요래 실행시킵니다. 저 의미는 28.in으로부터 입력을 받고, 28.out으로 출력한다는 의미입니다.

 

 

 ./gh_sol은 파일 입출력 없이 그냥 stdin으로부터 입력받고, stdout으로 출력해 주는 것인데요. 저 의미는 28.in으로부터 입력을 받겠다는 의미입니다. 그런데, < 연산자는 나중에 사용하도록 예약되어 있다는 에러가 뜨면서 되지 않습니다.

 


 그러면 해결 방법이 없을까요? 스택 오버플로우에 나와 있는 질답글 중에 type 명령어를 쓰라는 말이 있었습니다. 그리고 이 명령어에 대해서 공식 문서를 찾아보니, powershell에서는 Get-Content의 alias라고 하고, 해당 명령어는 special location에 있는 컨텐츠들을 얻어오는 명령어입니다.

 

 저는 텍스트 파일을 보는 것이므로 type을 쓰도록 하겠습니다. 여기서 2번째 인자는 경로, 파일명 등이 될 수 있겠네요.

 

 

 28.in에 있는 내용을 얻어왔습니다. 그러면 이런 내용을 볼 수 있는데요. 저 데이터의 정체는 실수 오차를 저격하기 위한 것이였습니다. 저 데이터 덕분에 n트가 상당히 많았습니다. 저 출력 결과는 ./gh_sol의 입력으로 쓰면 되겠네요? 파이프 라인으로 보내버리면 됩니다.

 

 

 그러면 요래 쓰면 되겠네요. 이 의미는 28.in에 들어있는 content의 내용을 ./gh_sol의 입력으로 받겠다는 것입니다.

 

 

 이 결과를 28.out으로 출력해 보겠습니다. 일단 28.out을 type 해 보니까 해당 파일이 없다는 에러가 뜨네요.

 

 

 > 28.out은 28.out 방향으로 보내겠다는 것을 의미합니다. 화살표 ->를 생각하시면 편하겠습니다.

 

 

 28.out에 있는 내용을 보니, 1이 두 개의 줄에 걸쳐서 나타났습니다.

 


 그런데 git bash가 깔려 있는 상황에서는 그냥 < 이나 > 을 써도 문제가 없습니다.

 

 

 이것은 ./gh_sol이 28.in으로부터 입력을 받는다는 의미인데요. 의도한 결과인 1이 2번 출력되었음을 알 수 있어요.

 

 

 즉, ./gh_sol이 28.in으로부터 입력받아서 28.out으로 출력하게 하기 위해 ./gh_sol < 28.in > 28.out 를 입력할 수 있어요.

 

 

 28.out을 확인해 보면, 1이 2번 나왔음을 알 수 있어요. type 명령어를 몰랐던 상태에서 git bash로 리다이렉션이 먹힌 것을 확인하고, 해당 방법을 급하게 적용하여, 인풋 파일에 대해, 어떤 결과값이 나와야 하는지 기대하는 결과값 파일을 생성할 수 있게 되었습니다.