일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 2025 대한민국 채용박람회
- 브루트포스 알고리즘
- 그리디 알고리즘
- 영어
- 라자냐
- 병역일터
- windows 12
- i자형 인재
- 잴다의 전설 티어스 오브 더 킹덤
- 시작
- 마인크래프트
- 코딩테스트
- 그래픽 디자인
- 빅오 표기법
- 스택
- 닌텐도 스위치 2
- 큐
- 자료구조
- 카니발대학교 공대강국
- vrm posing desktop
- Probuilder
- blender
- c#
- 배열 리스트
- 다이나믹프로그래밍
- VRoid Studio
- 택시 기하학
- 이진 탐색
- unity engine
- URP
Archives
- Today
- Total
WalkerJei's Lifelog
펜으로 문장 쓰기 C# 본문
세부 정보
- 문제명: 펜으로 문장 쓰기
- 언어: 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 |