아스키 아트
면접 대비시간 제한1초메모리 제한512 MB
N×M 격자의 RGB 값을 입력받아 주어진 강도 공식을 적용하고 임계값 표에 따라 문자로 변환해 출력한다.
문제

위와 같이 아스키 문자로 그린 그림을 '아스키 아트'라고 한다. 일반적인 그림 파일(.jpg, .png 등)은 해상도에 맞게 픽셀 단위로 나눈 2차원 그리드에 각 픽셀의 정보를 담는 방식으로 저장된다. 이 정보에는 여러 가지가 있지만, 그중 'R', 'G', 'B' 값은 'Red', 'Green', 'Blue' 3색이 각각 어느 정도 섞여 있는지를 나타내는 지표이며, 각 값은 0 이상 255 이하의 정숫값을 가진다.
아스키 아트는 격자 그리드에서 픽셀 하나 단위로 문자를 할당해 그림을 그리는 방식이므로, 우리가 알고 있는 모든 그림 파일은 아스키 아트로 다시 그릴 수 있다. 그러나 여러 색을 가질 수 있는 그림 파일과 달리 아스키 아트는 색상을 조절할 수 없고, 각 픽셀 내부의 채도만 조정할 수 있다. 원본 이미지가 흑백 이미지였다면 제법 비슷하게 바꿀 수 있지만, 여러 색으로 이루어졌다면 원본 이미지의 느낌을 살리기 힘들 것이다.
하지만 이미지를 흑백 이미지로 바꾸는 필터를 통해 원본 이미지를 흑백 이미지로 바꾸고, 그 이후 아스키 아트로 변환할 수 있다면 퀄리티가 높아질 수 있다. 아래는 이미지 하나가 아스키 아트로 변하는 예시를 보여준다.

어떤 그림 하나를 흑백 이미지로 바꾸기 위해 각 픽셀마다 R, G, B 3색이 어떤 비율로 혼합될지 결정하는 Intensity function을 사용한다. Intensity function은 0 이상 255 이하의 정수 R, G, B의 값을 받아 정수 하나를 리턴하는 함수로, 아래와 같이 정의한다.
위 함수의 결과값은 0 이상 2,550,000 이하의 값을 가지며, 값이 높을수록 흰색에 가깝고, 값이 낮을수록 검은색에 가까운 픽셀이 된다. 아스키 아트는 intensity function에 따라 정수 하나로 변환된 각 픽셀을 아래의 기준에 맞추어 변환하면 완성된다.
지금까지의 작업을 잘 따라왔다면, 훌륭한 ASCII Art Generator를 하나 만들 수 있을 것이다.
원본 이미지 하나의 해상도와 각 픽셀별 R,G,B 값이 주어지면, 이미지의 아스키 아트를 출력하는 프로그램을 작성해 보자.
입력
첫 줄에 그림의 세로의 길이 N과 가로의 길이 M이 주어진다. (1 ≤ N, M ≤ 400)
두번째 줄부터 N+1번째 줄까지 각 줄에 3M개의 정수가 주어진다.
이 중 i+1번째 줄의 3j-2, 3j-1, 3j번째 정수는 각각 R(i,j), G(i,j), B(i,j)를 뜻하며, 모든 값은 0 이상 255 이하이다.
이 때 R(i,j)는 i행 j열 픽셀의 R값, G(i,j)는 i행 j열 픽셀의 G값, B(i,j)는 i행 j열 픽셀의 B값을 의미한다.
출력
N×M 격자 형태로, 입력된 그림을 아스키 아트로 변환하여 출력한다.
줄 끝에 필요 없는 공백을 출력하지 않도록 주의한다.
힌트
예제의 원본 그림은 이렇게 생겼다.
