프로그래밍 언어 - C#(4) 반복문 및 관련 예제

이형눈이이상해
이형눈이이상해
∙∙조회 2

1. while

1.1. 복기

<false가 없으면 무한 반복이다>

  • 조건식이 true인 동안 반복된다.
  • break : 반복문 끝내는 용도.
  • continue : 이 후 로직을 무시하고 다음 루프로의 진행 용도.

2. for문

2.1. 복기

  • 초기식; 조건식; 증감식 순으로 작성된다.
  • 초기식 쪽에서는 변수를 생성해 진행을 했었음.
  • 조건식은 얼만큼 반복할 것인지.
  • 증감식은 두 조건에 따라 더해갈지 감소할지를 결정.
  • 당연히 break, continue 사용 가능.

3. while문의 확장 - dowhile

3.1. 개요

  • while이 true로만 설정하면 무한 반복, false만 들어가면 참이 설정되지 않아서 실행조차 되지 않는다.
  • dowhile은 최초 1회를 수행하고 조건식을 판별한다.
  • 보통 while문은 반복문 만나자마자 조건식부터 검사한다. dowhile은 로직을 먼저 수행하고 조건을 검사하는 반대의 서순을 가진다.

<어쨋든 1회는 본다는 것이다>

  • dowhile은 조건식이 false여도 1회 수행을 한다.

4. foreach문

4.1. 개요

  • for은 횟수나 범위 설정이 되어 있는 것을 반복할 때 사용한다. 특히 배열에서 자주 사용되었다.
  • 가령 int[] arr = {1, 2, 3, 4, 5, 6};가 있을 때 그대로 foreach로 돌려보도록 한다.
  • foreach는 다음과 같이 쓰인다.
csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        int[] arr = {1, 2, 3, 4, 5, 6};

        foreach (int i in arr)
        {
            Console.WriteLine(i);
        }
    }
}

  • arr라는 변수에서 i만큼 돌겠다라는 것.
  • 첫번째 루프 때는 i = arr[0], 두번째 루프 때는 i = arr[1], 세번째 루프 때는 i = arr[2] ... 라고 직관적으로 돌아간다.입력한 배열 크기만큼 돌아가기도 한다.
  • 지금은 배열밖에 없어서 for문으로도 돌릴 수 있다고 생각하지만 자료 구조에서 foreach를 적극적으로 사용할 수도 있다.
  • 순서가 보장되지 않는 형태일 때조차도 사용하기 편함. 어지간한 C# 자료구조에서 사용할 수 있다.

4.2. 한계

  • 하지만 함정이 존재하는 것이 for에서는 배열의 원소를 바꿀 수 있으나 foreach에서는 불가하다.
csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        int[] arr = {1, 2, 3, 4, 5, 6};

        foreach (int i in arr)
        {
            i = 0; // 불가
            Console.Write($"{i} ");
        }
    }
}

  • foreach는 자료구조를 읽거나 찾을 때 주로 사용된다고 인식하면 된다.
  • for문에서는 직관적으로 index가 어디인지 알 수 있지만 foreach는 불가하다.
  • 데이터 수정이 필요하다면 for문으로 수정해야 할 것을 생각할 것.
  • dowhile이나 foreach는 키워드를 인식하고 있는 것으로 충분하다.

4.3. foreach의 본질: iterator

  • 순환이 되는 기계를 만들어 정의해두는 형태.
  • 내부적인 것을 뜯어봤을 때 이런 형태로 돌아간다는 것을 수 있음.
  • 키워드만 들어봄직 했다 정도로 인식하면 될 것.

5. 반복문 관련 예제

5.1. 예제 1

csharp
// 랜덤 난수 생성 : rand.Next(최소값, 최대값);
        // ex) int randNum = rand.Next(-100, 100);
        // 1. 크기가 10인 배열을 생성하고 
        // 2. 배열 내부에 전부 랜덤 숫자 채우도록 한다.
        // 3. 배열 내부의 '최대값'이 몇이고 몇 번째 index에 있는지 for문 출력.
        // 4. 배열 내부의 '최소값'이 몇인지 foreach로 출력.

작성 코드

csharp
        Random rand = new Random();

        // 1. 
        int[] arr = new int[10];
        // 2.
        for (int i = 0; i < arr.Length; i++)
        {
            arr[i] =  rand.Next(-100, 100);
        }
        Console.WriteLine(string.Join(", ", arr));
        // 3.
        int largestNum = arr[0];
        int largestNumIndex = 0;
        for (int i = 0; i < arr.Length; i++)
        {
            if (arr[i] > largestNum)
            {
                largestNum = arr[i];
                largestNumIndex = i;
            }
        }
        Console.WriteLine($"최대값: {largestNum}, 주소값: {largestNumIndex}");
        // 4. 
        int minNum = arr[0];
        foreach (int i in arr)
        {
            if (i < minNum)
            {
                minNum = i;
            }
        }
        Console.WriteLine($"최소값: {minNum}");

  • 문제 설명
    논리적으로만 봤을 때, 최대값과 그 주소값을 임의로 지정하고 값들을 비교해야 한다. 다른 방법으로는 정렬이 있지만 배우지 않았으므로 넘어간다.
  • 3번 풀이
    최대값과 그 주소값을 먼저 지정하고 배열을 순회해야 한다. 반복문에서 순회하면서 값을 비교하도록 한다. 그리고 조건을 충족했을 때 최대값과 주소값을 새로 대입해준다. 그리고 출력해준다.
  • 4번 풀이
    비교를 위한 값을 먼저 준비해두고 순회를 foreach로 돈다. 그리고 출력을 하면 된다.

5.2. 예제 2

문제 관련 링크

작성코드

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        string message = "I love you~";
        int answer = 0;
        int fontSize = 2;

        answer = fontSize * (message.Length);
        Console.WriteLine(answer);
    }
}

5.3. 예제 3

문제 관련 링크

작성코드

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        double flo = 69.32f;
        int answer = 0;
        
        int convertAnswer = (int)flo;
        answer = convertAnswer;
    }
}

5.4. 예제 4

문제 관련 링크

작성코드

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        int number = 55;
        int n = 10;
        int m = 5;
        int answer = 0;

        if (number % n == 0 && number % m == 0)
        {
            answer = 1;
        }
        else
        {
            answer = 0;
        }
    }
}

5.5. 예제 5

문제 관련 링크

작성코드

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        int a = 91;
        int b = 2;

        int answer = 0;
        int sumResult = 0;
        string stringSumResult = "";
        string convertA = (string) Convert.ChangeType(a, typeof(string));
        string convertB = (string) Convert.ChangeType(b, typeof(string));
        stringSumResult = convertA + convertB;
        sumResult = (int)Convert.ChangeType(stringSumResult, typeof(int));
        
        int mulResult = 2 * a * b;

        if (sumResult >= mulResult)
        {
            answer = sumResult;
        }
        else
        {
            answer = mulResult;
        }
        
        Console.WriteLine(answer);
    }
}

모범코드

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        int a = 91;
        int b = 2;

        int answer = 0;
        int sumResult = int.Parse($"{a}{b}");
        int mulResult = 2 * a * b;
        if (sumResult >= mulResult)
        {
            answer = sumResult;
        }
        else
        {
            answer = mulResult;
        }
    }
}

5.6. 예제 6

문제 관련 링크 대문자/소문자 바꾸기가 있기는 한데 상당히 쉽게 바꿀 수 있는 방법이 존재는 한다.

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        string input = "aBcDeFg";
        Console.WriteLine(input.ToUpper());
    }
}

  • 하지만 의도는 이것을 사용해서 풀라고 하진 않음.

작성코드

csharp
string myString = "aBcDeFg";
        string answer = "";
        
        char[] myStringArray = myString.ToCharArray();
        for (int i = 0; i < myStringArray.Length; i++)
        {
            if (myStringArray[i] > 96)
            {
                answer += (char)(myStringArray[i] - 32);
            }
            else
            {
                answer += myStringArray[i];
            }
        }

5.7. 예제 7

문제 관련 링크

작성코드

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        string myString = "aBcDeFg";
        string answer = "";
        
        char[] myStringArray = myString.ToCharArray();
        for (int i = 0; i < myStringArray.Length; i++)
        {
            if (myStringArray[i] < 91)
            {
                answer += (char)(myStringArray[i] + 32);
            }
            else
            {
                answer += myStringArray[i];
            }
        }
    }
}

5.8. 예제 8

문제 관련 링크

작성코드

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        int[] array = { 7, 77, 17 };
        int answer = 0;
        string arrayConvert = "";
        for (int i = 0; i < array.Length; i++)
        {
            arrayConvert += array[i];
        }
        
        for (int j = 0; j < arrayConvert.Length; j++)
        {
            if (arrayConvert[j] == '7')
            {
                answer++;
            }
        }
    }
}

5.9. 예제 9

문제 관련 링크

작성코드

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        int answer = 1;
        int pizzaPieces = 7;
        for(int i=0;i<n;i++)
        {
            if(!(n<=pizzaPieces))
            {
                answer++;
                pizzaPieces+=7;
            }
        }
    }
}

5.10. 예제 10

문제 관련 링크

작성코드

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        public int[] solution(int[] num_list) 
    {
        int arData = num_list.Length;
        int[] answer = new int[arData];
        
        for (int i = 0; i <= arData - 1; i++)
        {
            answer[i] = num_list[arData - 1 - i];
        }
            return answer;
    }
    }
}

5.8. 예제 11

문제 관련 링크

작성코드

csharp
using System;

class Program
{
    static void Main(string[] args)
    {
        int answer = -1;

        if (A.Length == B.Length)
        {
            for (int i = 0; i < A.Length; i++)
            {
                string total = "";

                for (int j = 0; j < A.Length; j++)
                {
                    int index = j - i;

                    if (index < 0)
                    {
                        index += A.Length;
                    }

                    total += A[index];
                }
                Console.WriteLine(total);
                if (total == B)
                {
                    answer = i;
                    break;
                }
            }
        }
    }
}