Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
중앙대학교 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

Develop/알고리즘

[백준] 4344번, C# Write( ), WriteLine( ) 메서드에서 format 지정해주기

sm_amoled 2020. 7. 22. 20:21

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 지정해주기

복합 형식 지정 - 공식 Docs

기본적으로 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 }

320x100