정수 제곱근 판별, 24511번 queuestack
코딩테스트 : 정수 제곱근 판별
문제 설명
임의의 양의 정수 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 번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 x2 이라 한다. 을 2 번 자료구조에 삽입한 뒤
- ...
- xN−1 N 번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 xN 이라 한다. 을 N 번 자료구조에 삽입한 뒤
- 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를 사용하면 더욱 쉽게 된다.