View
Write( ), WriteLine( ) 메서드에서 format 지정해주기
printf("%d + %d = %d\n", a, b, sum); // a + b = sum 을 출력
C언어에서는 printf 라는 함수에서 출력하려는 값의 format을 지정해준 뒤 문자열 “” 밖에서 파라미터 형식으로 값을 전달해줄 수 있었다. 그래서 함수의 이름도 print+format 인 printf이었다. 사실 C#에서는 + 를 통해 문자열을 쉽게 합쳐서 출력할 수 있었다보니 이런 format 지정을 이용하지 않았다. (굉장한 낭비이긴 하지만, 단순히 백준 문제를 푸는 데 있어서는 크게 영향이 없더라고)
그런데 이 Format 지정을 써줘야하는 문제를 만났다.
각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
원 문제 : 백준 4344번
실수형 데이터의 소수점 위치를 정해주어서 소수점 아래 3자리까지만 숫자가 출력되게 만들어야 했다. C였다면 %.3f같은 식으로 해결할 수 있는 문제였지만, C#에서는 format 지정을 한번도 써본 적이 없으니 잘 모르겠더라. 그래서 찾아보았다.
Write( ), WriteLine( ) 메서드에서 format 지정해주기
기본적으로 Write(), WriteLine() 메서드(이하 Write 메서드)는 인자로 오는 대부분의 값들을 출력할 수 있다. 만약 이를 '+'로 묶어서 출력한다면 하나의 문자열로 알아서 만들어 출력하는 편리한 기능도 갖추고 있다. 우리가 알고싶은 건 이게 아니니 넘어가자.
Index 구성요소
먼저, C#에는 형식 지정 없이 값이 들어갈 자리만 지정해주는 방법이 있다.
Console.Write("Prime numbers less than 10: {0}, {1}, {2}, {3}", 2, 3, 5, 7)
여기에서 {0}, {1}, … 은 뒤에 따라오는 인자들의 index 번호를 말한다. {0}은 0번 값, {1}은 1번 값 등의 순이다. 이게 번호를 지정할 수 있다는 점이 장점이 될 수도 있을 것 같더라. 아래와 같이 index 번호를 섞어도 알아서 잘 인식한다.
Console.WriteLine("{0} + {1} + {2} = {0}", 0, 1, -1);
Format 구성요소
Format은 C보다 더 많은 종류를 갖고있다.
- D, d : 10진수
- X, x : 16진수
- F, f : 고정 소수점
- 0 : 000.00 처럼 표기하면, 0이 있는 자리에 0이 아닌 숫자가 있으면 숫자를 넣고, 숫자가 없거나 0이면 0을 넣어 출력한다.
- # : ###.## 처럼 표기하면, #이 있는 자리에 숫자가 있으면 숫자를 넣고, 숫자가 없거나 의미없는 0이면 비우고 출력한다.
위와같은 Format을 비롯하여 더 많은 유용한 Format을 지원한다.
-
P, p : 백분율로 변환하여 % 붙여 출력
-
E, e : 지수 표기법으로 출력
-
C, c : 통화($)로 표기하여 출력
-
날짜를 나타내는 DateTime 형식을 가져올 경우 미리 지정된 여러 양식으로 가공하여 날짜 및 시간 출력
Console.WriteLine("{0:D}, {0:F}, {0:F4}, {0:X}", 15);
결과 : 15, 15.00, 15.0000, F
Console.WriteLine("{0:00.00}, {0:##.##}, {0:P}, {0:P0}", 5.15);
결과 : 05.15, 5.15, 515.00 %, 515 %
위와 같이 { Index : Format } 의 형식으로 원하는 인자와 출력하고싶은 Format을 지정해줄 수 있다.
Alignment 구성요소
Alignment는 단순하게 이야기하자면 문자열이 차지하는 너비를 이야기한다. 출력하는 문자열의 크기가 얼마나 짧든 최소한 이 만큼의 공간은 확보해주겠다는 뜻이다. 내 기억으로는 C에도 이거랑 비슷한 기능이 있었던걸로 기억한다.
Console.WriteLine("*{0,10}*\n*{1,10}*\n*{2,10}*", 12345, 123456, 1234567);
이런 코드를 작성해서 돌리면 아래와 같은 결과를 얻을 수 있다.
* 12345*
* 123456*
* 1234567*
오른쪽 정렬이 아닌, 왼쪽 정렬은 -를 붙여서 만들어줄 수 있다.
Console.WriteLine("*{0,-10}*\n*{1,-10}*\n*{2,-10}*", 12345, 123456, 1234567);
*12345 *
*123456 *
*1234567 *
Index, Format, Alignment 구성요소를 모두 합친다면 이런 형식으로 Write 메서드에서 값을 가공하여 출력할 수 있다.
{ Index [, Alignment] : Format }
'Develop > 알고리즘' 카테고리의 다른 글
[백준] 2352 - 반도체 설계 (0) | 2021.08.09 |
---|---|
[백준] 1072 - 게임 (0) | 2021.08.09 |
[백준] 12015 - 가장 긴 증가하는 부분 수열 2 (0) | 2021.08.09 |
[백준] 15552번, String과 StringBuilder (0) | 2020.07.18 |
C#으로 알고리즘 시작 (0) | 2020.07.18 |