https://www.acmicpc.net/problem/1475
문제
다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.
다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다. 다솜이의 방 번호가 주어졌을 때, 필요한 세트의 개수의 최솟값을 출력하시오. (6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용할 수 있다.)
입력
첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 필요한 세트의 개수를 출력한다.
예제 입력 1
9999
예제 출력 1
2
예제 입력 2
122
예제 출력 2
2
예제 입력 3
12635
예제 출력 3
1
예제 입력 4
888888
예제 출력 4
6
풀이
6과 9 처리를 잘 못해서 1시간 초과했다.
풀이를 보니 6과 9의 세트수와 두 숫자를 제외한 세트 수 중 최댓값을 출력하면 된다고 한다.
최대 세트 수를 구하는 것이고, 6과 9의 세트 수는 문제에서 다르게 계산해야 한다고 했으니 6과 9의 세트 수와 이들을 제외한 숫자들의 세트 수 중 최대 값을 출력하면 된다.
6과 9의 세트 수는 (6의 세트 개수 + 9의 세트 개수 + 1) / 2를 하면 된다. (6과 9로 이루어진 숫자로 계산해 보니 맞다)
정답 코드
public class BOJ1475
{
static void Main(string[] args)
{
int[] arr = new int[10];
int numberIndex = 0;
int max = 0;
int number = int.Parse(Console.ReadLine());
while(number / 10 != 0)
{
numberIndex = number % 10;
number = number / 10;
arr[numberIndex] += 1;
}
numberIndex = number % 10;
number = number / 10;
arr[numberIndex] += 1;
for(int i = 0; i < 10; i++)
{
if (i == 6 || i == 9) continue;
max = arr[i] > max ? arr[i] : max;
}
max = max > (arr[6] + arr[9] + 1) / 2 ? max : (arr[6] + arr[9] + 1) / 2;
//Console.WriteLine(arr.Max());
Console.WriteLine(max);
}
}
복습1 (5/1)
복습1 코드 - 오답
using System.Text;
namespace 배열_구현
{
internal class BOJ1475_방번호_복습1
{
static StreamReader sr = new StreamReader(Console.OpenStandardInput());
static StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
static StringBuilder sb = new StringBuilder();
static void Main(string[] args)
{
int N = int.Parse(sr.ReadLine());
int[] arr = new int[10];
int remainder = 0;
while (true)
{
remainder = N % 10;
arr[remainder]++;
N = N / 10;
if (N == 0) break;
}
//arr[remainder]++;
int sum = arr[6] + arr[9];
arr[6] = sum / 2;
arr[9] = sum / 2;
sb.Append($"{arr.Max()}");
sw.WriteLine(sb.ToString());
sw.Close();
sr.Close();
sb.Clear();
}
}
}
arr[6] + arr[9]가 짝수일 경우 문제가 없지만, arr[6] + arr[9]가 홀수일 경우 sum / 2는 소수점을 뗀 수가 나온다.
예를 들면 666이면 arr[6] + arr[9] = 3 + 0 = 3이다. 3 / 2는 1이다. 근데 666으로는 2세트를 만들 수 있다. 1세트가 아니다.
홀수일 경우 arr[6] + arr[9] + 1으로 sum을 계산하면 666은 2세트로 계산된다.
복습1 코드 - 정답
using System.Text;
namespace 배열_구현
{
internal class BOJ1475_방번호_복습1
{
static StreamReader sr = new StreamReader(Console.OpenStandardInput());
static StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
static StringBuilder sb = new StringBuilder();
static void Main(string[] args)
{
int N = int.Parse(sr.ReadLine());
int[] arr = new int[10];
int remainder = 0;
while (true)
{
remainder = N % 10;
arr[remainder]++;
N = N / 10;
if (N == 0) break;
}
int sum = arr[6] + arr[9] + 1;
arr[6] = sum / 2;
arr[9] = sum / 2;
sb.Append($"{arr.Max()}");
sw.WriteLine(sb.ToString());
sw.Close();
sr.Close();
sb.Clear();
}
}
}'자료구조, 코딩테스트 > 배열(Array)' 카테고리의 다른 글
| [코딩테스트] BOJ 13300 - 방 배정 (실패) (0) | 2026.04.01 |
|---|---|
| [코딩테스트] BOJ 10807 - 개수 세기 (성공) (0) | 2026.03.31 |
| [코딩테스트] BOJ 3273 - 두 수의 합 (성공) (0) | 2026.03.30 |
| [코딩테스트] BOJ2577 - 숫자의 개수 (성공) (0) | 2026.03.25 |
| [자료구조] 배열(Array) (0) | 2026.03.19 |