C#
브5 1000 A+B
내 코드
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
using System;
namespace Baekjoon
{
class Program
{
static void Main()
{
string s = Console.ReadLine();
string[] ss = s.Split();
int a, b;
a = int.Parse(ss[0]);
b = int.Parse(ss[1]);
Console.WriteLine(a+b);
}
}
}
|
cs |
브5 1001 A-B
내 코드
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
using System;
namespace Baekjoon
{
class Program
{
static void Main()
{
string s = Console.ReadLine();
string[] ss = s.Split();
int a, b;
a = int.Parse(ss[0]);
b = int.Parse(ss[1]);
Console.WriteLine(a-b);
}
}
}
|
cs |
브4 1008 A/B
내 코드
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
using System;
namespace Baekjoon
{
class Program
{
static void Main()
{
string s = Console.ReadLine();
string[] ss = s.Split();
int a, b;
a = int.Parse(ss[0]);
b = int.Parse(ss[1]);
Console.WriteLine((double)a/b);
}
}
}
|
cs |
브2 1152 단어의 개수
문제
영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
입력
첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.
출력
첫째 줄에 단어의 개수를 출력한다.
예제 입력 1
The Curious Case of Benjamin Button
예제 출력 1
6
예제 입력 2
The first character is a blank
예제 출력 2
6
예제 입력 3
The last character is a blank
예제 출력 3
6
내 코드
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
using System;
namespace Baekjoon
{
class Program
{
static void Main()
{
string s = Console.ReadLine().Trim();
if (string.IsNullOrWhiteSpace(s))
{
Console.WriteLine("0");
}
else
{
Console.WriteLine(s.Split(" ").Length);
}
}
}
}
|
cs |
문자열에 앞뒤 공백이 있으면 공백도 단어로 계산을 해버리기에 앞뒤 공백을 Trime()으로 제거해준다.
입력 조건에서 공백이 연속으로 오는 경우는 없다고 명시했으므로 중간에 공백은 더이상 예외처리가 필요없다.
다만 단어를 아무것도 입력하지 않았을 때에도 Split()해버리면 단어를 하나가 있는 것을 취급해버리므로 예외처리가 필요하다. 그래서 string.IsNullOrWhiteSpace를 사용하여 공백임을 구별하였다. 비슷하게 IsNullOrEmpty가 있는데 IsNullOrEmpty는 null과 ""만 true를 return하고 IsNullOrWhiteSpace는 null, "", " ", "\t" 등의 공백문자도 모두 true로 return한다. 여기서 9번째 줄을 if (s=="")로 해도 똑같은 결과가 나온다.
내 코드는 시간이 144ms가 걸렸으나 백준에서 가장 짧은 C# 코드는 96ms로 다음 코드이다.
최단 시간 코드
|
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
32
33
34
35
36
37
38
39
|
using System;
class Program
{
static void Main(string[] args)
{
string str = Console.ReadLine();
char[] charArr = str.ToCharArray();
int cnt = 0;
if (String.IsNullOrWhiteSpace(str))
{
Console.WriteLine(cnt);
return;
}
else
{
cnt += 1;
}
for (int i = 0; i <= charArr.Length - 1; i++)
{
if (i == 0 && charArr[i] == ' ')
{
continue;
}
else if (i == charArr.Length - 1 && charArr[i] == ' ')
{
break;
}
else if (charArr[i] == ' ')
{
cnt += 1;
}
}
Console.WriteLine(cnt);
}
}
|
cs |
IsNullOrWhiteSpace로 문자열이 공백임을 판별하고 공백이 아닐 경우 일단 단어가 하나는 있음을 가정한다.
그리고 Split()이 아니라 ToCharArray()로 문자열을 char 단위로 한 글자씩 담아서 반복문으로 첫 번째 char가 공백이면 넘어가고, 마지막 char가 공백이면 단어 수 세기를 멈추고 그 외에는 공백을 만날 때마다 단어 개수(cnt)를 하나씩 더해주는 식으로 짠 것을 확인할 수 있었다.
브1 1157 단어 공부
문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
예제 입력 1
Mississipi
예제 출력 1
?
예제 입력 2
zZa
예제 출력 2
Z
예제 입력 3
z
예제 출력 3
Z
예제 입력 4
baaa
예제 출력 4
A
내 코드
|
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
32
33
34
35
36
37
38
|
using System;
using System.Collections.Generic;
using System.Linq;
namespace Baekjoon
{
class Program
{
static void Main()
{
String s = Console.ReadLine().ToUpper();
Dictionary<char, int> wordDic = new Dictionary<char, int>();
for (int i = 0; i < s.Length; i++)
{
if (!wordDic.ContainsKey(s[i]))
{
wordDic.Add(s[i], 1);
}
else
{
wordDic[s[i]] = wordDic[s[i]] + 1;
}
}
int maxValue = wordDic.Max(p => p.Value);
List<int> valueList = new List<int>(wordDic.Values);
List<int> maxNum = valueList.FindAll(x=> x==maxValue);
if (maxNum.Count != 1)
{
Console.WriteLine("?");
}
else
{
Console.WriteLine(wordDic.FirstOrDefault(x => x.Value == maxNum[0]).Key);
}
}
}
}
|
cs |
출력 결과가 ? 혹은 대문자여야하므로 입력받은 문자열을 모두 대문자로 변환시켜주었다.
파이썬으로 풀던 방식대로 한 글자씩 딕셔너리로 하면 좋을 것 같아 Collectons을 임포트하여 Dictionary를 key, value를 char,int 자료형으로 사용하였다. 처음에는 딕셔너리에 글자를 넣을 때는 글자가 딕셔너리에 없으므로 Add해서 value를 1로 넣어주고 같은 글자가 딕셔너리에 key로 있다면 value를 1씩 더해주는 방식으로 반복문을 사용하였다.
딕셔너리를 무사히 만들고나면 어느 글자가 젤 많은지 세기만 하면 된다.
여기서 젤 수가 많은 글자가 하나라면 Linq를 임포트하여 Max만 해주면 된다.
다만 출력 조건에 여러 개이면 ?를 출력하라 했으므로 딕셔너리의 value를 List로 만들어서 Max 값이 두 개 이상이면 ?를 출력하면 될 것 같았다.
그러다가 List 메소드에 조건에 맞는 값을 모두 리스트로 담아주는 FindAll이라는 메소드가 있는 것을 알게 되었고 이 방법이 직접 반복문으로 찾는 것보다 낫지 않을까 싶어 FindAll을 이용하였다.
Count를 이용하여 담은 List 길이가 1이 아니면 ?를 출력하고 1이면 딕셔너리에서 Value가 maxNum List 값(길이가 1이므로 [0]의 값)과 같은 Key를 출력한다. maxValue를 저장했으므로 maxNum List에 다시 접근하지 않아도 될 것 같다.
내 코드는 시간이 168ms가 걸렸으나 백준에서 가장 짧은 C# 코드는 104ms로 다음 코드이다.
최단 시간 코드
|
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
using System;
using static System.Console;
using System.IO;
using System.Text;
namespace BaekJoon_Practice
{
class Program
{
static void Main(string[] args)
{
string phrase = ReadLine();
int[] alphabetArr = new int[26];
for(int i = 0; i < phrase.Length; i++)
{
if(phrase[i] > 96)
{
alphabetArr[phrase[i] - 32 - 65] ++;
}
else
{
alphabetArr[phrase[i] - 65]++;
}
}
int max = 0;
char repChar = 'A';
for(int i = 0; i < alphabetArr.Length; i++)
{
if(max < alphabetArr[i])
{
max = alphabetArr[i];
repChar = (char)(i + 65);
}
else if(max == alphabetArr[i])
{
repChar = '?';
}
}
Write(repChar);
}
}
}
|
cs |
알파벳 배열을 만들고 ToUpper()하는 대신 영어 소문자가 아스키코드 97부터 시작하므로 96보다 크면 32를 빼서 대문자화시킨다. 19번째 줄은 A가 아스키코드 65이므로 A부터 배열의 0번째 인덱스에 넣는다는 뜻이다. 그래서 글자의 아스키코드로 alphabetArr int 배열에 담아준다.
여기까지 하면 딕셔너리를 만든 것과 같은 과정까지 왔다.
max값을 0으로 일단 초기화해놓고 for문으로 max보다 크면 max 값으로 만든다.
그리고 인덱스에 65를 더해서 대문자 아스키코드로 만들어서 출력할 char에 담는다.
만약 max가 alphabetArr 배열의 요소와 같다면 무조건 알파벳이 하나라도 있으면 max에 0이 아닌 무언가가 담기게 되므로 결국 가장 많이 사용된 알파벳이 두 개 이상이라는 뜻이므로 ?를 출력할 char에 담는다.
System.Console을 임포트하였으므로 입출력시에 ReadLine(), Write()로 사용한 것을 알 수 있다.
백준 C# 문제풀이 소감
백준 문제를 몇 문제 풀다보니 프로그래머스와 비교해서 문제를 풀고나서 내 답안을 남과 비교하기에 조금 아쉬운 것 같다. 프로그래머스는 풀고나면 다른 사람의 답을 직관적으로 볼 수 있고 댓글도 달려 있어서 나와 다르게 짠 코드를 쉽게 볼 수 있는데 백준은 코드 시간, 코드 길이를 보고 직접 눌러서 코드를 봐야 한다.
그리고 C#으로 풀다보니 파이썬으로 풀던 것보다 조금 더 신경써야 할 게 생긴다. 파이썬으로 풀던 방식으로 생각하다보니 이게 맞나라는 생각이 들고 그래서 프로그래머스에서처럼 남의 코드를 보기 쉽게 되어있던 것이 그립기도 하다.




최근댓글