[HackerRank] Sparse Arrays

오늘 문제는 너무 기초네..;;; 

주어진 배열안에 검색어가 몇 개인지 찾는 문제..;;

 

static int[] matchingStrings(string[] strings, string[] queries) {
        List result = new List();
        foreach(string q in queries)
        {
            result.Add(GetContainsCount(strings, q));
        }
        return result.ToArray();
    }

    static int GetContainsCount(string[] arr, string q)
    {
        List list = new List(arr);
        int result = list.Count(x => q.Contains(x));
        return result;
    }

[Hackerrank] Left Rotation

 배열 a 중에 특정한 숫자  n을  지정한 횟수 d 만큼 왼쪽으로

로테이션 시키는 문제

 

class Solution {



    static void Main(string[] args) {
        string[] nd = Console.ReadLine().Split(' ');

        int n = Convert.ToInt32(nd[0]);

        int d = Convert.ToInt32(nd[1]);

        int[] a = Array.ConvertAll(Console.ReadLine().Split(' '), aTemp => Convert.ToInt32(aTemp))
        ;

        int[] result = GetRotateArray(n, d, a);
        Console.WriteLine(string.Join(" ", result));
    }

    static int[] GetRotateArray(int n, int d, int[] a)
    {
        int length = a.Length;
        int rCnt = d % length;
        
        int[] resultArray = new int[length];
        for(int i = 0 ; i < length; i++)
        {
            int newIndex = GetIndex(i, length, d);
            resultArray[newIndex] = a[i];
        }
        return resultArray;
    }

    static int GetIndex(int index, int l, int d)
    {
        int result = 0;
        result = index + (l - d); 
        if(result > (l - 1)) result -= l;
       
        return result;
    }
}

 

[HackerRank] Sherlock and Anagrams

문자열내의 Anagram 쌍이 몇개인지 찾는 문제

단어를 잘라서 Lowercase 로 변환, 정렬 후

Dictionary 에  (단어, 갯수) 로 넣어서  계산하는 방식도 될 거 같은데

일단 무식한 방법으로 풀어봤다.

3중for문이라 인풋값에 긴 문자열이 들어오면

타임아웃이 뜬다;;; 

 

static int sherlockAndAnagrams(string s)
        {
            int result = 0;
            for (int i = 1; i < s.Length + 1; i++) //i 는 단어의 길이 점점 늘어남
            {
                List words = new List();
                for (int j = 0; j < s.Length - (i -1); j++)
                {
                    string word = s.Substring(j, i);
                    words.Add(word);
                    Console.WriteLine(j + " , "+ i +" / "+ word);
                }
                Console.WriteLine("words count = "+ words.Count);
                
                for (int k = 0; k < words.Count - 1; k++)
                {
                    for (int l = k + 1; l < words.Count; l++)
                    {
                        if (isAnagram(words[k], words[l]))
                            result++;
                    }
                }
            }

            Console.WriteLine("result = "+result);

            return result;
        }

        static bool isAnagram(string str1, string str2)
        {
            if (str1.Length != str2.Length) return false;

            char[] char1 = str1.ToLower().ToCharArray();
            char[] char2 = str2.ToLower().ToCharArray();

            Array.Sort(char1);
            Array.Sort(char2);

            string nStr1 = new string(char1);
            string nStr2 = new string(char2);
            Console.WriteLine(nStr1 + " / " + nStr2);
            return nStr1.Equals(nStr2);
        }

[HackerRank] New Year Chaos

줄을 서있는데  뒷사람이 앞사람에게 뇌물을 주고 자리를 바꿀 수 있음

한 사람당 2회 가능.

주어진 순서가 되려면 몇번 뇌물이 오고갔는가?

헷갈리네. ㅠ 

 static void minimumBribes(int[] q)
        {
            const int bribePower = 2;
            bool isChaotic = false;
            int n = q.Length;
            for (int i = 0; i  bribePower)
                {
                    Console.WriteLine("Too chaotic");
                    isChaotic = true;
                    break;
                }
            }
            
            int bribeCount = 0;
            if (isChaotic == false)
            {
                for (int i = 0; i < n; i++)
                {
                    Console.WriteLine("i =" + i + "q[i]-2 =" + (q[i] - 2));
                    for (int j = Math.Max(0, q[i]-2); j < i; j++)
                    {
                        Console.WriteLine(" j = "+j);
                        Console.WriteLine(string.Format("q[{0}] : {1} / q[{2}] : {3}", i, q[i], j, q[j]));

                        if (q[j] > q[i])
                        {
                            Console.WriteLine("bribeCount++");
                            bribeCount++;
                        }
                            
                    }
                    Console.WriteLine("========================================");
                }
               
                Console.WriteLine(bribeCount);
            }

        }

 

[Hackerrank] 2D Array – DS

2중 배열안에서 모래시계 모양의 패턴을 찾아 

해당 좌표의 값을 모두 더했을 때 가장 큰 값을 찾는 문제

음수 비교가 필요한 경우가 있으므로 결과값 변수를 int.MinValue로 초기화 한다. 

static int hourglassSum(int[][] arr) {
        int result = int.MinValue;
        int row = arr.Length;
        for (int i = 0; i < row -2; i++)
        {
            int col = arr[i].Length;
            for (int j = 0; j < col -2; j++)
            {                            
                int sum = arr[i][j] + arr[i][j + 1] + arr[i][j + 2];
                sum += arr[i + 1][j + 1];
                sum += (arr[i+2][j] + arr[i+2][j + 1] + arr[i+2][j + 2]);
                
                if (result < sum) result = sum;
            }
        }

        return result;

    }

[Hackerrank] Repeated String

인풋값은 두가지

반복 할 문자열, 문자열의 총 길이.

문자열의 총 길이만큼 문자열을 반복한 후에 

전체 문자열에 포함된 a 의 갯수를 구하는 문제.

static long repeatedString(string s, long n) {
        long result = 0;
        long strLength = s.Length;
        var cntStr = new System.Text.RegularExpressions.Regex("a");
        long aCount = cntStr.Matches(s).Count;
        long q =  n / strLength;
        long r = n % strLength;
        result = q * aCount;
      
         if(r > 0)
        {
            var rStr = new System.Text.RegularExpressions.Regex("a");
            long rCntStr = rStr.Matches(s.Substring(0, (int)r), 0).Count;
            result += rCntStr;
        }

        return result;

    }
	
	

[Hackerrank] Jumping On Cloud

한 번에 최대 두칸 이동 가능

상태값이 1인 좌표로는 이동 불가

총 몇회 점프를 했는지 구하는 문제

static int jumpingOnClouds(int[] c)
    {
        int jumpCount = 0;
        int num = 0;
        int jumpPower = 2;
        for (int i = 0; i < c.Length; i++)
        {
            jumpPower--;
            if(jumpPower == 0 || (jumpPower == 1 && c[i] == 1))
            {
                jumpPower = 2;
                jumpCount++;
            }
        }
        return jumpCount;
    }

[Hackerrank] Counting Valleys

게리가 계곡을 몇번이나 들어갔었는지 체크하는 문제

   static int countingValleys(int n, string s)
        {
            int vallyCount = 0;
            int att = 0;
            int lastAtt = 0;
            char[] steps = s.ToCharArray();
            for (int i = 0; i < n; i++)
            {
                lastAtt = att;
                if (steps[i] == 'U') att++;
                else if (steps[i] == 'D') att--;

                if (lastAtt < 1 && att == 0) vallyCount++;

            }
            return vallyCount;
        }