자료구조, 코딩테스트/배열(Array)

[코딩테스트] BOJ 1475 - 방 번호 (실패)

RꞮbble 2026. 3. 25. 22:14

 

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();
        }
    }
}