4. 조건문과 반복문

  1. 조건문
    1. if-else
    2. switch-case
  2. 반복문
    1. for
    2. while



조건문

1. if-else

if-else 조건문은 조건에 따른 분기를 생성한다.

if (조건문), else if (조건문), else 의 형태로 쓰이며, 각각 순서대로 조건을 검사하고 참일 경우 해당 분기에 해당하는 코드를 실행한다.

#include <iostream>
using namespace std;

int main()
{
	int var = 33;

	if (50 <= var && var < 100) //값이 50 이상이고 100 미만을 동시에 만족하는 경우
	{
		cout << "var은 50 이상이고 100보다 작다";
	}
	else if (20 <= var && var < 50) //값이 20 이상이고 50 미만을 동시에 만족하는 경우
	{
		cout << "var은 20 이상이고 50보다 작다";
	}
	else if (50 <= var && var < 20) //값이 0 이상이고 20 미만을 동시에 만족하는 경우
	{
		cout << "var은 0 이상이고 20보다 작다";
	}
	else    //위의 조건문을 모두 만족하지 못하는 경우
	{
		cout << "var은 음수이다";
	}


	return 0;
}


2. switch-case

switch 조건문은 앞의 if-else 조건문과는 달리 조건문에 비교 연산자의 사용이 불가능하다. swutch (변수) 에서 받은 변수를 case (조건) 에서 조건과 비교하여 일치 여부를 판단하고, 참일 경우 이어지는 코드를 순차적으로 실행한다.

주의할 점은, if-else 조건문과는 달리 case 조건 이후 break; 으로 구문을 빠져나와야 해당 조건문의 코드만을 수행한다. 만약 break; 가 누락될 경우 break; 를 만날 때까지 모든 분기의 코드를 수행한다.

int main()
{
	long long LL = 20;
	switch (LL)
	{
	case 30:
		cout << "LL is 30\n";	//조건에 맞지 않아 실행되지 않음
		
	case 20:
		cout << "LL is 20\n";	//break 가 누락됨
	case 10:
		cout << "LL is 10\n";	//여기까지 실행된다
		break;
	default:
		cout << "LL is nothing\n";
		break;
	}
}



반복문

1. for

for 반복문은 for ((초기화), (조건문), (반복식)) 으로 이루어져 있다.

초기화 부분은 for 반복문 시작 시 최초로 한번만 실행되며, 루프의 인덱스 부분을 초기화하는 용도로 사용된다.

조건문에는 루프를 실행하기 위한 조건이 들어간다. 값이 참(non-zero)일 경우 루프에 진입한다.

반복식 부분에는 1회의 루프가 끝난 뒤 실행된다. 주로 루프 인덱스의 증가 또는 감소에 사용된다.


- 예제: 점 찍기

다음은 프로그래머스 Lv.2 의 점 찍기 문제이다.

for 반복문을 이용하여 점을 찍고, 제한 조건과 계산 도중에서의 자료형 크기에 의한 데이터 손실에만 주의하면 쉽게 풀어 낼 수 있다.


문제 설명

좌표평면을 좋아하는 진수는 x축과 y축이 직교하는 2차원 좌표평면에 점을 찍으면서 놀고 있습니다. 진수는 두 양의 정수 k, d가 주어질 때 다음과 같이 점을 찍으려 합니다.

  • 원점(0, 0)으로부터 x축 방향으로 ak(a = 0, 1, 2, 3 …), y축 방향으로 bk(b = 0, 1, 2, 3 …)만큼 떨어진 위치에 점을 찍습니다.
  • 원점과 거리가 d를 넘는 위치에는 점을 찍지 않습니다.

예를 들어, k가 2, d가 4인 경우에는 (0, 0), (0, 2), (0, 4), (2, 0), (2, 2), (4, 0) 위치에 점을 찍어 총 6개의 점을 찍습니다.

정수 k와 원점과의 거리를 나타내는 정수 d가 주어졌을 때, 점이 총 몇 개 찍히는지 return 하는 solution 함수를 완성하세요.


제한 조건

  • $1 ≤ k ≤ 1,000,000$
  • $1 ≤ d ≤ 1,000,000$


#include <iostream>
#include <cmath>

using namespace std;

long long solution1(int k, int d) {
    long long answer = 0;
    for (long long a = 0; a <= d; a += k) 
    {
        long long maxY = sqrt((long long)d * d - (long long)a * a);
        answer += (long long)(maxY / k) + 1;
    }
    return answer;
}


2. while

while 반복문은 조건문이 거짓(0)일 때까지 루프를 실행한다. 즉, 참일 경우 루프에 진입하고 조건문이 거짓이 되면 루프에 진입하지 않고 종료된다.

조건문에 bool 변수를 넣어서 반복을 제어할 수도 있으며, 반복문 중간에 break; 를 만날 경우 즉시 반복문을 종료한다.

continue; 를 이용해서 반복문의 초입으로 돌아갈 수도 있다.

#include <iostream>

int main() 
{
    int n = 10;

    while (n > 0)   //n이 양수일 때 루프 진입
    {
        std::cout << n << std::endl;    //n 값을 출력한다. 10, 9, 8, ..., 2, 1 까지 출력된 후 반복문이 종료된다.
        n--;        //n의 값에 1을 뺀다
    }

    return 0;
}