WalkerJei's Lifelog

펜으로 문장 쓰기 C# 본문

소프트웨어 개발/코딩테스트(자체 문제)

펜으로 문장 쓰기 C#

WalkerJei 2025. 5. 18. 08:14

세부 정보

  • 문제명: 펜으로 문장 쓰기
  • 언어: C#
  • 비고: 

 

문제

글씨를 쓰는 펜이 있길래 글씨를 써 보려고 한다. 문장은 영어 소문자 형태로 주어지며 띄어쓰기는 없다. 이 펜으로 알파벳 소문자를 쓰면 획수에 따라 잉크를 소비하는 특성이 있다.

주어진 획수는 다음과 같다

알파벳 획수 알파벳 획수
a 1 n 1
b 2 o 1
c 1 p 2
d 2 q 1
e 1 r 1
f 2 s 1
g 1 t 2
h 1 u 1
i 2 v 1
j 2 w 1
k 3 x 2
l 1 y 2
m 1 z 1

참고로 글씨를 쓰다 보면 잉크가 남아도 글씨를 쓰기에 양이 부족하면 글씨를 쓸 수 없다. 잉크가 다 떨어져도 글씨를 쓸 수 없으며, 잉크가 남아도 글씨를 다 쓰면 글씨 쓰는 것을 멈춘다.

주어진 잉크를 사용해서 쓴 글씨와 남은 잉크 양을 출력하는 프로그램을 작성하시오

 

입력

첫째 줄에 잉크 양을 자연수 형태로 주어진다.

둘째 줄에는 잉크를 소비해서 작성하려고 하는 문장을 작성한다.

 

출력

주어진 잉크로 최대한 작성한 문장을 출력한다.

그 다음 줄에는 문장을 작성하고 남은 잉크의 양을 출력한다.

 

예제 입력 1:

30

dragonfly

 

예제 출력 1:

dragonfly

18

 

예제 입력 2:

5

butterfly

 

예제 출력 2:

but

0

 

풀이 펼쳐보기: 일단 먼저 자력으로 풀어보고 열어볼 것을 권한다.

더보기

풀이

아스키 코드로 소문자 a는 97의 값을 가진다.

using System.Text;

class PenAndInk
{
    public static int ConsumeInk(char alphabet)
    {
        // 문자 작성에 소비할 잉크
        int consumeInk = 0;
        // abcdefghijklm
        // nopqrstuvwxyz
        int[] writingCount = {
            1, 2, 1, 2, 1, 2, 1, 1, 2, 2, 3, 1, 1,
            1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1 };

        // 입력받은 문자에 맞는 잉크 소비량을 계산한다.
        for (int i = 0; i < writingCount.Length; i++)
        {
            // 아스키 코드를 활용해 소문자 획수에 따른 잉크 소비량을 결정한다
            if (Convert.ToInt32(alphabet - 97) == i)
                consumeInk = writingCount[i];
        }

        // 소비할 잉크 양 값 반환
        return consumeInk;
    }

    static void Main(string[] args)
    {
        StreamReader sr = new StreamReader(Console.OpenStandardInput());
        StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
        StringBuilder sb = new StringBuilder();

        // 현재 잉크 양을 입력받아 저장
        int ink = Convert.ToInt32(sr.ReadLine());
        // 잉크로 작성할 문자열로 소문자 형태로 저장한다.
        string sentence = sr.ReadLine().ToLower();
        
        int i = 0;

        // 글을 다 쓸때까지 반복
        while (i < sentence.Length)
        {           
            // 만약에 잉크가 부족해 글씨를 쓰지 못하거나 잉크를 다 쓰면 종료한다.
            // 잉크가 남아도 문장을 다 쓰면 종료한다
            if (ink < ConsumeInk(sentence[i]) || ink <= 0 || sb.Length == sentence.Length)
                break;
            
            // 획수에 따라 잉크 소모
            ink -= ConsumeInk(sentence[i]);
            // 문장 작성
            sb.Append(sentence[i]);

            i++;
        }

        // 주어진 잉크로 최대한 작성한 문장 출력
        sw.WriteLine(sb);
        // 작성하고 남은 잉크 양 출력
        sw.WriteLine(ink);

        sr.Close();
        sw.Close();
    }
}

 

후기

아스키 코드를 활용하는 법을 복습해 보고자 해 봤다. 작성을 할 때 while(true)로 작성하면 문장의 맨 앞 문자만 주구장창 써대기 때문에 while(i < sentence.Length)로 작성하자 원하는 결과가 나올 수 있었다. 다음에는 대문자도 작업해 보기로 하면서 마친다.

'소프트웨어 개발 > 코딩테스트(자체 문제)' 카테고리의 다른 글

구매 가능한 활 C#  (0) 2025.05.09
자녀 결혼순서 C#  (0) 2025.05.02