일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 병역일터
- c#
- 큐
- unity engine
- 택시 기하학
- 시작
- 다이나믹프로그래밍
- 하이테일
- windows 12
- 잴다의 전설 티어스 오브 더 킹덤
- 코딩테스트
- 스택
- 2025 대한민국 채용박람회
- 배열 리스트
- Probuilder
- 그리디 알고리즘
- 영어
- vrm posing desktop
- 자료구조
- URP
- 라자냐
- 카니발대학교 공대강국
- blender
- i자형 인재
- 닌텐도 스위치 2
- 빅오 표기법
- 그래픽 디자인
- 브루트포스 알고리즘
- 마인크래프트
- VRoid Studio
- Today
- Total
WalkerJei's Lifelog
백준알고리즘 10810번 공 넣기 C# 본문
세부 정보
- 사이트: 백준알고리즘
- 번호: 10810
- 문제명: 공 넣기
- 언어: C#
- 분류: 구현, 시뮬레이션
- 비고:
문제
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 또, 1번부터 N번까지 번호가 적혀있는 공을 매우 많이 가지고 있다. 가장 처음 바구니에는 공이 들어있지 않으며, 바구니에는 공을 1개만 넣을 수 있다.
도현이는 앞으로 M번 공을 넣으려고 한다. 도현이는 한 번 공을 넣을 때, 공을 넣을 바구니 범위를 정하고, 정한 바구니에 모두 같은 번호가 적혀있는 공을 넣는다. 만약, 바구니에 공이 이미 있는 경우에는 들어있는 공을 빼고, 새로 공을 넣는다. 공을 넣을 바구니는 연속되어 있어야 한다.
공을 어떻게 넣을지가 주어졌을 때, M번 공을 넣은 이후에 각 바구니에 어떤 공이 들어 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
둘째 줄부터 M개의 줄에 걸쳐서 공을 넣는 방법이 주어진다. 각 방법은 세 정수 i j k로 이루어져 있으며, i번 바구니부터 j번 바구니까지에 k번 번호가 적혀져 있는 공을 넣는다는 뜻이다. 예를 들어, 2 5 6은 2번 바구니부터 5번 바구니까지에 6번 공을 넣는다는 뜻이다. (1 ≤ i ≤ j ≤ N, 1 ≤ k ≤ N)
도현이는 입력으로 주어진 순서대로 공을 넣는다.
출력
1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다. 공이 들어있지 않은 바구니는 0을 출력한다.
풀이
소스 코드에서는 바구니가 0번부터 N - 1번까지 있는 것으로 구현했기에 바구니에 공을 넣거나 공을 꺼내고 새로 넣는 로직은 배열 ijk의 값에서 1을 뺀 값이 들어가게 설계해야 한다. 당연하지만 j <= ijk[1]로 해야 오류 없이 정상적으로 값을 넣을 수 있다.
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
// 바구니의 개수와 공을 넣는 방법의 개수 입력
int[] nm = sr.ReadLine().Split().Select(int.Parse).ToArray();
// 바구니 생성
int[] basketN = new int[nm[0]];
for (int i = 0; i < nm[1]; i++)
{
// i번 바구니부터 j번 바구니까지 k번 번호가 적힌 공을 넣는 입력을 받는다.
int[] ijk = sr.ReadLine().Split().Select(int.Parse).ToArray();
// 바구니에 공을 넣으며 공이 이미 있다면 꺼내고 새로 넣는다.
for(int j = ijk[0] - 1; j <= ijk[1] - 1; j++)
basketN[j] = ijk[2];
}
for (int i = 0; i < nm[0]; i++)
{
// 바구니에 공이 없다면 0을 출력한다
if(basketN[i] == 0)
sw.Write("0 ");
// 바구니에 공이 있다면 공의 번호를 출력한다
else
sw.Write(basketN[i] + " ");
}
sr.Close();
sw.Close();
후기
원래는 어제 풀었던 VPS 관련 문제와 비슷한 난이도의 문제가 많이 남아있는 줄 알고 문제를 찾으려다가 별로 없어서 확인해서 대신 이 문제를 풀었다. 이 문제도 갑자기 오류가 나기는 했지만 생각외로 빠르게 오류의 원인을 찾아서 해결했다.
원인인 오류는 바구니에 공을 넣는 로직을 이렇게 쓴 것이었다.
for(int j = ijk[0] - 1; i <= ijk[1] - 1; j++)
왜 오류가 나는가 싶어서 디버깅을 돌려보다가 IEumerable Visualizer 창을 우연히 띄우면서 해당 기능이 디버깅에 유용하다는 것을 확인했다. 소가 뒷걸음질 쳐서 쥐 잡은 격이다.
'소프트웨어 개발 > 코딩테스트(기성 문제)' 카테고리의 다른 글
백준알고리즘 2231번 분해수 C# (0) | 2025.04.10 |
---|---|
백준알고리즘 10813번 공 바꾸기 C# (0) | 2025.04.09 |
백준알고리즘 9012번 괄호 C# (0) | 2025.04.07 |
백준알고리즘 10978번 세로읽기 C# (0) | 2025.04.06 |
백준알고리즘 2566번 최댓값 C# (0) | 2025.04.05 |