코딩테스트 : 10798번 새로 읽기
아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다.
이 장난감에 있는 글자들은 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’이다. 영석이는 칠판에 글자들을 수평으로 일렬로 붙여서 단어를 만든다. 다시 그 아래쪽에 글자들을 붙여서 또 다른 단어를 만든다. 이런 식으로 다섯 개의 단어를 만든다. 아래 그림 1은 영석이가 칠판에 붙여 만든 단어들의 예이다.
A A B C D D
a f z z
0 9 1 2 1
a 8 E W g 6
P 5 h 3 k x
<그림 1>
한 줄의 단어는 글자들을 빈칸 없이 연속으로 나열해서 최대 15개의 글자들로 이루어진다. 또한 만들어진 다섯 개의 단어들의 글자 개수는 서로 다를 수 있다.
심심해진 영석이는 칠판에 만들어진 다섯 개의 단어를 세로로 읽으려 한다. 세로로 읽을 때, 각 단어의 첫 번째 글자들을 위에서 아래로 세로로 읽는다. 다음에 두 번째 글자들을 세로로 읽는다. 이런 식으로 왼쪽에서 오른쪽으로 한 자리씩 이동 하면서 동일한 자리의 글자들을 세로로 읽어 나간다. 위의 그림 1의 다섯 번째 자리를 보면 두 번째 줄의 다섯 번째 자리의 글자는 없다. 이런 경우처럼 세로로 읽을 때 해당 자리의 글자가 없으면, 읽지 않고 그 다음 글자를 계속 읽는다. 그림 1의 다섯 번째 자리를 세로로 읽으면 D1gk로 읽는다.
그림 1에서 영석이가 세로로 읽은 순서대로 글자들을 공백 없이 출력하면 다음과 같다:
Aa0aPAf985Bz1EhCz2W3D1gkD6x
칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오.
입력
총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.
출력
영석이가 세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다.
namespace ConsoleApp1
{
public class Program
{
public static void Main()
{
string[,] args = new string[5,15];
for (int i = 0; i < 5; i++)
{
string s = Console.ReadLine();
for (int j = 0; j < 15; j++)
{
if (j < s.Length)
{
args[i,j] = s[j].ToString();
}
else
{
args[i,j] = "";
}
}
}
string answer = "";
for (int j = 0; j < 15; j++)
{
for (int i = 0; i < 5; i++)
{
answer += args[i,j];
}
}
Console.WriteLine(answer);
}
}
}
1. 주어진대로 다 배열에 넣은 다음 , 순서대로 읽을 것인지 ?
2. 아니면 따로따로 리스트를 만들어서 순서대로 읽을 것인지 ?
흠.. 일단 1번 방법으로 해 봐야지.
성공 ~
다른 사람의 흥미로운 풀이
예외처리를 꼭 이렇게 안하고, 그냥 읽는대로 배열로 만들고,
2차원 배열로 만들어서 푸는 방법도 있다. 아마 문제가 의도한 바는 그렇게 푸는게 맞는 것 같다.
그럼 코드 300자 즈음으로 나온다.
코딩테스트 : 2564번 색종이
가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.
입력
첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다
출력
첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.
namespace ConsoleApp1
{
public class Program
{
public static void Main()
{
int num = Int32.Parse(Console.ReadLine());
int[,] matrix = new int[100, 100];
for (int i = 0; i < num; i++)
{
string s = Console.ReadLine();
int[] numbers = s.Split(' ').Select(Int32.Parse).ToArray();
int row = numbers[0];
int col = numbers[1];
for (int r = row; r < row + 10; r++)
{
for (int c = col; c < col + 10; c++)
{
if (r < matrix.GetLength(0) && c < matrix.GetLength(1))
{
matrix[r, c]++;
}
}
}
}
int count = 0;
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
if (matrix[i, j] != 0)
{
count++;
}
}
}
Console.WriteLine(count);
}
}
}
처음에 예외 처리 안해서 한 번, 두 번째로는 배열을 선언할 때
int[,] matrix = new int[100, 100]; 가 아닌 99 99 로 선언해서 틀렸었다(ㅇ ㅖ시는 맞음)
왜냐 ! 어쩌피 0~1 , 1~2 부터 99~100까지 101개의 칸이 있기 때문에 배열로 100 100해도 맞다는 사실.
다른 사람의 흥미로운 풀이
굳이 Count를 따로 할 필요 없이, 같은 반복문 안에서 matrix[ r, c] ++를 해주는 것이 아니라 그냥 1로 바꾸고 답을 더해줘도 된다. 대신 검사 조건을 matrix[i, j] == 0일떄 로 바꾸면 된다.
즉, 같은 반복문을 두 번 쓰지 않는 것이 제일좋다.
코딩테스트 : 2745번 진법 변환
문제
B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.
10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.
A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35
입력
첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)
B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.
출력
첫째 줄에 B진법 수 N을 10진법으로 출력한다.
namespace ConsoleApp1
{
public class Program
{
public static void Main()
{
String[] s = Console.ReadLine().Split(' ');
float answer = 0;
Dictionary<char, int> dic = new Dictionary<char, int>()
{
{ 'A', 1 }, { 'B', 2 },
{ 'C', 3 }, { 'D', 4 }, { 'E', 5 }, { 'F', 6 }, { 'G', 7 }, { 'H', 8 }, { 'I', 9 }, { 'J', 10 },
{ 'K', 11 }, { 'L', 12 }, { 'M', 13 }, { 'N', 14 }, { 'O', 15 }, { 'P', 16 }, { 'Q', 17 }, { 'R', 18 },
{ 'S', 19 }, { 'T', 20 }, { 'U', 21 }, { 'V', 22 }, { 'W', 23 }, { 'X', 24 }, { 'Y', 25 }, { 'Z', 26 }
};
for (int i = 0; i < s[0].Length; i++)
{
char c = s[0][i];
float num = 0;
if (dic.ContainsKey(c))
{
num = 9 + dic[c];
}
else
{
num = s[0][i];
}
num *= MathF.Pow(Int32.Parse(s[1]), s[0].Length - i -1);
answer += num;
}
Console.WriteLine(answer);
}
}
}
Dic을 쓰고 싶지 않았지만.. .이렇게 풀었는데 예제에서 1 차이가 났다
1 차이가 난다는 것은 지금 36의 0승이 더해지지 않은 것 같다. MathF.Pow라는 함수를 처음 봐서 찾아봤다.
그래서 로그도 다 찍어 봤는데 숫자는 다 이쁘게 떨어진다.
58786560 1632960 45360 1260 35를 더했을 때 마지막 자리가 6이 나와버리는 오류가 있었다.
왜 ? float의 정밀도 부족이라고 한다...
진짜 1시간 넘게 고민했던 문제가 부동소수점 문제, 그러니까 MathF를 써서 벌어진 문제라서 너무 서운하다.
다른 사람의 흥미로운 풀이
ulong으로 Matf를 쓰시는 분이 있었다.
'코딩테스트' 카테고리의 다른 글
2903번 중앙 이동 알고리즘, 2292번 벌집,1193 분수 찾기,2869 달팽이는 올라가고 싶다. (0) | 2025.01.21 |
---|---|
코딩 테스트 : 11005번 진법 변환 2, 2720 세탁소 사장 동혁 (0) | 2025.01.20 |
코딩 테스트 : 25206 너의 평점은, 2566번 최댓값, 2738 행렬 덧셈 (0) | 2025.01.17 |
백준 : 1157번 단어 공부, 2941번 크로아티아 알파벳, 1316 그룹 단어 체커 (0) | 2025.01.16 |
코딩테스트 : 3033 킹, 퀸, 룩, 비숍, 나이트, 폰 // 별 찍기 -7, 팰린드롬인지 확인하기 (0) | 2025.01.16 |