코딩테스트

정수 제곱근 판별, 24511번 queuestack

Cadi 2025. 2. 9. 19:14

코딩테스트 : 정수 제곱근 판별

문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

제한 사항
n은 1이상, 50000000000000 이하인 양의 정수입니다.
입출력 예
n return
121 144
3 -1
입출력 예 설명
입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.

입출력 예#2
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.

using System;
public class Solution
{
    public long solution(long n)
    {
        long answer = 0;

        float max = MathF.Sqrt(50000000000000);
        float temp = MathF.Sqrt(n);

        for (long i = 1; i <= max; i++)
        {
            if (temp == i)
            {
                return (i + 1) * (i + 1);
            }
        }
        return -1;
    }
}

다른 사람의 흥미로운 풀이

 

이렇게 쉬운 문제를 가져온 이유는 생각치 못한 방법 때문이다. 

 

1. MathF.Sqrt로 나온 숫자를 %1 (1로 나눔) 으로 판별.

2. MathF.Sqrt로 나온 숫자를 int 나 long인 소숫점이 없는 타입으로 형변환 뒤 다시 제곱해서 숫자가 같은지 판별

 

써 먹는 방법이 나올수도 있으니 기억 !!

 

 

 

코딩테스트 : 24511번 queuestack

시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 (추가 시간 없음) 1024 MB (추가 메모리 없음) 21850 7561 6385 33.689%

문제

한가롭게 방학에 놀고 있던 도현이는 갑자기 재밌는 자료구조를 생각해냈다. 그 자료구조의 이름은 queuestack이다.

queuestack의 구조는 다음과 같다. 1번, 2번, ... , N번의 자료구조(queue 혹은 stack)가 나열되어있으며, 각각의 자료구조에는 한 개의 원소가 들어있다.

queuestack의 작동은 다음과 같다.

  •  x0을 입력받는다.
  •  x0 1번 자료구조에 삽입한 뒤 1번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 x1이라 한다.
  •  x1을 2번 자료구조에 삽입한 뒤 2번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 x2이라 한다.
  • ...
  •  xN−1을 N번 자료구조에 삽입한 뒤 N번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 xN이라 한다.
  •  xN을 리턴한다.

도현이는 길이 M의 수열 C를 가져와서 수열의 원소를 앞에서부터 차례대로 queuestack에 삽입할 것이다. 이전에 삽입한 결과는 남아 있다. (예제 1 참고)

queuestack에 넣을 원소들이 주어졌을 때, 해당 원소를 넣은 리턴값을 출력하는 프로그램을 작성해보자.

입력

첫째 줄에 queuestack을 구성하는 자료구조의 개수 N이 주어진다. (1≤N≤100000)

둘째 줄에 길이 N의 수열 A가 주어진다. i번 자료구조가 큐라면 Ai=0, 스택이라면 Ai=1이다.

셋째 줄에 길이 N의 수열 B가 주어진다. Bi i번 자료구조에 들어 있는 원소이다. (1≤Bi≤1000000000)

넷째 줄에 삽입할 수열의 길이 M이 주어진다. (1≤M≤100000)

다섯째 줄에 queuestack에 삽입할 원소를 담고 있는 길이 M의 수열 C가 주어진다. (1≤Ci≤1000000000)

입력으로 주어지는 모든 수는 정수이다.

출력

수열 C의 원소를 차례대로 queuestack에 삽입했을 때의 리턴값을 공백으로 구분하여 출력한다.

using System.Text;

public class Solution
{
    public static void Main()
    {
        int length = Convert.ToInt32(Console.ReadLine());
        
        int[] QueueOrStack = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        List<int>[] list = new List<int>[length];
        int[] numbersIn = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        
        for (int i = 0; i < length; i++)
        {
            list[i] = new List<int>();
            list[i].Add(numbersIn[i]);
        }
        
        int numberLength = Convert.ToInt32(Console.ReadLine());
        int[] numbers = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

        StringBuilder sb = new();

        for (int i = 0; i < numberLength; i++)
        {
            int temp = numbers[i];
            int nextdata = temp;
            for (int j = 0; j < length; j++)
            {
                if (QueueOrStack[j] == 0)
                {
                   list[j].Add(nextdata); 
                   nextdata = list[j][0];
                   list[j].RemoveAt(0);
                }
                else if (QueueOrStack[j] == 1)
                {
                }
            }
            sb.Append(nextdata +" ");
        }
        Console.WriteLine(sb.ToString());
    }
}

이렇게 풀고 시간 초과가 뜨니까  든 생각, 

굳이... Stack일 경우를 체크할 필요가 있나.. ? 

엄청 간단하게 풀 수 있을것 같은데.. ? 

 


using System.Text;

public class Solution
{
    public static void Main()
    {
        int listNum = int.Parse(Console.ReadLine());

        int[] arr = Console.ReadLine().Split().Select(int.Parse).ToArray();

        int[] numbers = Console.ReadLine().Split().Select(int.Parse).ToArray();

        int length = int.Parse(Console.ReadLine());

        int[] numbersIn = Console.ReadLine().Split().Select(int.Parse).ToArray();

        List<int> list = new List<int>();

        for (int i = 0; i < arr.Length; i++)
        {
            if (arr[i] == 0) list.Add(numbers[i]);
        }
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < numbersIn.Length; i++)
        {
            list.Insert(0,numbersIn[i]);
            sb.Append(list.Last() + " ");
            list.RemoveAt(list.Count - 1);
        }
        Console.WriteLine(sb.ToString());
    }
}

 

그냥 리스트로 만들어서 해결 !

 

다른 사람의 흥미로운 풀이

 

보니까 비슷하지만 리스트에서 하나하나 빼는 방식이 아닌 Queue를 사용하면 더욱 쉽게 된다.