Notice
Recent Posts
05-18 22:43
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Today
Total
관리 메뉴

프로그래밍 잡화점

Short Coding (숏코딩) - C# Version 본문

C# 고찰

Short Coding (숏코딩) - C# Version

Luana7 2021. 9. 14. 20:41

백준 숏코딩에 빠진 필자가 들고 온 것은 바로 C# 숏코딩이다.

 

사실 C# 숏코딩을 해도 C같은 다른 언어(특히 GolfScript)에 못 미치는건 사실이다.

다만, C# 숏코딩은 타 언어에 비해서 경쟁력이 낮아 C# 카테고리에서 1등을 차지하기 쉬울것이다.

 

그럼 바이트 수를 줄이는 방법을 연구해보자

 

가장 쉬운 문제인 A+B를 이용해서 구해보자.

 

1. 변수명은 최대한 짧게!

 

using System;

var inp = Console.ReadLine().Split(' ');

int x1 = int.Parse(inp[0]);
int x2 = int.Parse(inp[1]);

Console.WriteLine(x1 + x2);
// 141 B

 

위에 작성한 코드의 변수명은(사실 조금 과장한 감이 없잖아 있다만) 꽤나 길다. 저러한 변수들은 모두 1글자로 줄일 수 있다. 또한 x1과 x2가 같은 형식이므로 int를 생략할 수 있다

using System;

var i = Console.ReadLine().Split(' ');

int a = int.Parse(i[0]),
    b = int.Parse(i[1]);

Console.WriteLine(a+b);
// 129 B

2. 기본 라이브러리 함수를 최대한 활용해보자!

 

위 코드의 문제점은 a와 b를 새로 할당해서 변환하는 작업을 거친다는 것이다. 이를 간략하게 줄여줄 메서드가 있는데, 바로 Array.ConvertAll이라는 함수이다. 내용에 대해서는 아래 링크를 참조하자.

 

 

Array.ConvertAll<tinput,toutput>(TInput[], Converter<tinput,toutput>) 메서드 (System)</tinput,toutput></tinput,toutput>

한 형식의 배열을 다른 형식의 배열로 변환합니다.Converts an array of one type to an array of another type.

docs.microsoft.com

 

함수를 이용해 a와 b를 사용하지 않고 배열만을 이용해보자. 또한 WriteLine이 아닌 Write함수로 대체할 수 있다.

using System;

var i = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);

Console.Write(i[0]+i[1]);
// 109 B

자 점점 코드가 줄어드는게 눈에 보일 것이다.

 

3. 필요 없는 공백,  줄바꿈을 다 지우보자

 

숏코딩은 가독성 따위는 개나줘버린다. 가령 꼭 공백이 필요한 경우가 아니라면 싹 지워버리자. 줄바꿈 또한 전혀 필요하지 않다.

using System;var i=Array.ConvertAll(Console.ReadLine().Split(' '),int.Parse);Console.Write(i[0]+i[1]);
// 102 B

이렇게 해서 처음 141B에서 102B로 무려 39B나 줄였다.

 

x. 알고리즘 이용하기

 

여기서 조금 더 나아가면, 알고리즘을 이용하면 조금 더 짧은 코드가 나온다.

백준 문제 1000번에는 "(0 < A, B < 10)" 이러한 조건이 있다. 이를 이용해서 아스키 코드의 특성을 이용한 알고리즘을 쓸 수 있는데 코드는 다음과 같다.

using static System.Console;Write(Read()-3*Read()+Read());
// 58 B

무려 58B까지 줄어들었다. 멀쩡한 코드같아 보이지는 않는다. 과연 무슨 원리일까?

 

Read() 함수는 한 글자를 읽어서 ascii 코드값을 반환한다. A와 B가 0과 10사이의 수임으로 한 글자만 받아도 어떠한 경우에서든지 성립이 가능하다.

 

Read()를 총 3번 읽는다 이를 나눠보면.

Read 1 : A값을 얻는다.

Read 2 : 공백을 얻는다. (ASCII : 32)

Read 3 : B값을 얻는다.

 

여기서 한가지 알고넘어갈 점은 ASCII에서 '0'과 '0'을 더한 값은 공백인 32를 3번 곱한 값이랑 일치한다. 따라서 A와 B의 아스키를 더한 후 공백의 아스키를 3번 곱한 값을 빼주면 int로 변환하는 과정 없이 바로 숫자를 뽑아 낼 수 있다.

 

y. for문 트릭

 

for문은 특이한 성질을 가지고 있다. C에서 숏코딩을 해봤다면 알법한 내용이다. 혹시나 궁금하다면 아래 주소로 들어가서 내용을 봐보자

 

for에 관한 고찰

C#에서 자주 보이는 구문이 하나 있다. 바로 "for". ​ for은 반복을 해주는 반복문으로써 꽤 자주 쓰이게 되는데, 최근에 발견한 for에 관한 이야기이다. ​ 우리가 잘 알고 있듯이 for문은 다음과 같

thinkcs.tistory.com

위 내용처럼, for문 트릭을 이용함으로써 선언자 생략, 조건문 변형등이 가능하다.


숏코딩 재밌어 보이지 않는가? A+B 다음으로 쉬운 A-B를 스스로 도전해보길 바란다.

 

참고로 필자의 A-B 기록은 58B이다. 위와 같은 방법을 응용해서 코드를 줄여보길 바란다. 

'C# 고찰' 카테고리의 다른 글

Switch (string) 성능에 관한 고찰  (2) 2022.08.08
for에 관한 고찰  (0) 2021.06.09
Comments