코딩 테스트/BOJ

C# 1158 요세푸스 문제

s0002 2023. 2. 19. 20:53

그냥 큐를 이용해서 푼 코드

using System;
using System.Collections;

namespace _1158
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nk = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
            int n = nk[0];
            int k = nk[1];

            Queue q = new Queue();
            int[] JosephusArr = new int[n];

            for (int i = 1; i <= n; i++)
            {
                q.Enqueue(i);
            }

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < k-1; j++)
                {
                    int num = (int)q.Dequeue();
                    q.Enqueue(num);
                }
                int JosephusNum = (int)q.Dequeue();                                
                JosephusArr[i] = JosephusNum;

                //q 값 확인
                //Console.Write("\nq value:");
                //foreach (var num in q)
                //{
                //    Console.Write(num);
                //}
                //Console.WriteLine();
            }

            Console.Write("<");
            for (int i = 0; i < n-1; i++)
            {               
                Console.Write("{0}, ",JosephusArr[i]);
            }
            Console.Write("{0}>", JosephusArr[JosephusArr.Length - 1]);
        }
    }
}

 

위의 코드를 바탕으로

배열을 사용한 원형 큐를 구현해 푼 코드

using System;
using System.Collections;

namespace _1158
{
    class Program
    {
        //원형 큐 클래스
        class CircularQueue
        {
            public int front = 0;
            public int rear = 0;
            public int size;
            public int[] arrQ;

            public CircularQueue(int size)
            {

                this.size = size;
                this.arrQ = new int[this.size];
            }

            public void Enqueue(int num)
            {
                if ((this.rear + 1) % this.size == this.front)
                {
                    //큐 가득 참
                }
                else
                {
                    this.rear = (this.rear + 1) % this.size;
                    this.arrQ[this.rear] = num;
                    //Console.WriteLine("rear: {0}, add arrQ value: {1}", this.rear, this.arrQ[this.rear]);
                }
            }
            public int Dequeue()
            {
                if (this.rear == this.front)
                {
                    //큐 비어있음
                    return -1;
                }
                else
                {
                    this.front = (this.front + 1) % this.size;
                    //Console.WriteLine("front: {0}",front);
                    int temp = arrQ[front];
                    arrQ[front] = 0;
                    return temp;
                }
            }
        }

        static void Main(string[] args)
        {
            int[] nk = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
            int n = nk[0];
            int k = nk[1];

            CircularQueue circularQueue = new CircularQueue(n+1);
            int[] JosephusArr = new int[n];

            for (int i = 0; i < n; i++)
            {
                circularQueue.Enqueue(i + 1);              
            }

            //circularQueue.arrQ의 k번째 값을 JosephusArr에 넣는 과정을 반복한다
            for (int i = 0; i < n; i++)
            {
                //circularQueue.arrQ의 1~k-1 번째 값을 Dequeue한 후
                //circularQueue.arrQ에 Enqueue한다
                for (int j = 0; j < k - 1; j++)
                {                   
                    int num = circularQueue.Dequeue();
                    circularQueue.Enqueue(num);
                }

                int JosephusNum = circularQueue.Dequeue();
                JosephusArr[i] = JosephusNum;
            }

            Console.Write("<");
            for (int i = 0; i < n - 1; i++)
            {
                Console.Write("{0}, ", JosephusArr[i]);
            }
            Console.Write("{0}>", JosephusArr[JosephusArr.Length - 1]);           
        }
    }
}

 

결과

'코딩 테스트 > BOJ' 카테고리의 다른 글

C# 2581 소수  (0) 2023.02.06
C# 10162 전자레인지  (0) 2023.02.01
C# 2231 분해합  (0) 2023.01.31
C# 1654 랜선 자르기(틀림)  (0) 2023.01.26
C# 2003 수들의 합2  (0) 2023.01.20