글
프로그래머스 레벨2 C# 연속 부분 수열 합의 개수(Hash.Count, HashSet, Skip, Take, JAVA)
/// 내가 작성한 코드
using System;
using System.Collections.Generic;
using System.Linq;
public class Solution {
public int solution(int[] elements) {
int[] doublearray = new int[2 * elements.Length];
/// 2배 길이의 배열을 작성해서 뒤에서 앞으로 합계를 구하는 경우가 가능하게 했다.
HashSet<int> hash = new HashSet<int>(); // 중복 저장이 불가능한 HashSet을 썼다.
for(int i = 0;i<2*elements.Length;i++)
{
doublearray[i] = elements[i%elements.Length];
}
/// 2배 배열을 대입
for(int i = 0;i<elements.Length;i++)
{
for(int j = 0;j<elements.Length;j++)
{
int[] newArray = doublearray.Skip(i).Take(j+1).ToArray();
hash.Add(newArray.Sum());
}
}
return hash.Count;
}
}
// 되기는 되는데 시간이 엄청나게 오래 걸려서 겨우겨우 실행이 됐다. 그래서 다른 분 코드를 참조한 것을 했다.
// skip부터 시작해서 take에 있는 숫자 만큼 취한다.
//
//
//
//
using System;
public class Solution {
public int solution(int[] elements)
{
int answer = 0;
int[] flagedInts = new int[elements.Length * 1000 + 1]; // 100만개까지 배열을 만든다. 길이가 1000이고, 배열에 들어가는 수가 1000까지니까 최대가 1000 * 1000 = 100만개까지 나온다. 전부 0이 들어가 있다.
for(int addingLen = 1; addingLen <= elements.Length; addingLen++)
{
for (int i = 0; i < elements.Length; i++)
{
int idx = 0;
for (int j = 0; j < addingLen; j++)
{
idx += elements[(i + j) % (elements.Length)];
}
// 선택된 배열 인덱스만 1을 집어넣게 해서 if문으로 중복을 걸러내고 answer의 값을 플러스 시켜서 갯수를 구한다.
if (flagedInts[idx] == 0)
{
flagedInts[idx] = 1;
answer++;
}
}
}
return answer;
}
}
// 이게 시간이 훨씬 덜 나온다.
자바
import java.util.*;
class Solution {
public int solution(int[] elements) {
Set<Integer> set = new HashSet<>();
int start = 1;
while(start < elements.length)
{
for (int i = 0; i < elements.length; i++)
{
int value = 0;
for (int j = i; j < i+start; j++)
{
value += elements[j%elements.length];
}
set.add(value);
}
start++;
}
int sum = 0;
for (int i = 0; i < elements.length; i++)
sum += elements[i];
set.add(sum);
return set.size();
}
}
import java.util.*;
class Solution {
public int solution(int[] elements) {
int answer = 0;
Set<Integer> set = new HashSet<>();
int start = 0;
for(int i=0; i<elements.length; i++)
{
int n = 1;
int idx = i;
int sum = 0;
while(n <= elements.length)
{
sum += elements[idx++];
set.add(sum);
if(idx >= elements.length)
idx = 0;
n++;
}
}
answer = set.size();
return answer;
}
}
'프로그래밍' 카테고리의 다른 글
프로그래머스 레벨2 주식가격 C#(JAVA) (0) | 2023.02.23 |
---|---|
프로그래머스 레벨2 뒤에 있는 큰 수 찾기 C#(JAVA) peek, pop, push (0) | 2023.02.23 |
프로그래머스 C# 행렬의 곱셈(3중 for문, JAVA) (0) | 2023.02.11 |
프로그래머스 C# 예상 대진표(JAVA) (0) | 2023.02.11 |
프로그래머스 문자열 내의 p와 y의 개수(JAVA, toLowerCase().split(""), equals) (0) | 2023.02.11 |