프로그래밍 언어 - C#(4) 반복문 및 관련 예제
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는 다음과 같이 쓰인다.
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에서는 불가하다.
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
// 랜덤 난수 생성 : rand.Next(최소값, 최대값);
// ex) int randNum = rand.Next(-100, 100);
// 1. 크기가 10인 배열을 생성하고
// 2. 배열 내부에 전부 랜덤 숫자 채우도록 한다.
// 3. 배열 내부의 '최대값'이 몇이고 몇 번째 index에 있는지 for문 출력.
// 4. 배열 내부의 '최소값'이 몇인지 foreach로 출력.
작성 코드
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
작성코드
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
작성코드
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
작성코드
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
작성코드
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);
}
}
모범코드
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
문제 관련 링크 대문자/소문자 바꾸기가 있기는 한데 상당히 쉽게 바꿀 수 있는 방법이 존재는 한다.
using System;
class Program
{
static void Main(string[] args)
{
string input = "aBcDeFg";
Console.WriteLine(input.ToUpper());
}
}
- 하지만 의도는 이것을 사용해서 풀라고 하진 않음.
작성코드
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
작성코드
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
작성코드
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
작성코드
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
작성코드
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
작성코드
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;
}
}
}
}
}




