8 min read

cpp[3] - 조건문

cpp[3] - 조건문

숫자를 입력받고 사칙연산을 할 수 있게 되었지만, 아직 프로그램을 작성하기에는 많은 부분이 부족합니다.

지금부터는 프로그램의 "흐름"을 제어할 수 있는 부분들에 대해서 다루게 될 것이며, 그 시작은 특정한 조건에 따라 다른 결과를 내놓을 수 있게 하는 조건문입니다.

고등교육에서의 조건문

고등수학을 열심히 이수하신 여러분들께서는,

기본개념] 구간에 따라 다르게 정의된 함수의 미분가능성

이런 정리를 접하신 적이 있을 겁니다.

이때 x는 a보다 크거나 같은 모든 값에서 g(x) 를 따르며,
a보다 작은 모든 값에서서는 h(x) 를 따릅니다.
이를 프로그래밍에서도 그대로 구현할 수 있습니다.

C++ 흐름의 단위, 블록

계속 이야기하고 있는 "흐름" 이란 무엇일까요
C++언어에서 프로그램은 반드시 위에서 아래로 흐르며,
순서대로 모든 줄을 한번씩 실행하게 됩니다.

하지만, 이러한 규칙은 중괄호 {} 로 묶인 같은 블록 내에서만 성립합니다.
지금까지 저희가 본 int main(){} 에서도 {} 를 통해 하나의 블록을 만들어 주었기 때문에, 위에서 아래로 훑으며 실행될 수 있었습니다.

#include <bits/stdc++.h>
using namespace std;

int main(){ // 블록의 시작.
	int N;
	cin >> N;
	cout << N;
	return 0;
} // 블록의 끝.

보다 복잡한 프로그램을 작성하고자 할 때는, 이 블록을 원하는 순서대로 적절히 배치해서 우리가 원하는 순서에 맞게 프로그램이 실행될 수 있도록 해주어야 합니다.

이때 각각의 블록들은 실행되지 않을수도 있으며, 여러번 반복해서 실행될 수도 있고, 블록 안에 블록이 겹쳐질수도 있습니다.

조건문 if

if문의 문법은 다음과 같습니다

if(조건){실행할 내용}

조건이 충족될 때에만, 바로 뒤에 있는 {} 블록을 실행시킵니다.
이 블록 안에는 또다시 수많은 구문들이 작성될 수 있습니다.
예제 문제를 통해서 if구문을 보도록 하겠습니다.

1330번: 두 수 비교하기
#include <bits/stdc++.h>
using namespace std;

int main(){
	int A,B;
	cin >> A >> B;
	
	if(A==B){ // A와 B가 같다면
		cout << "==";
	}
	if(A>B){ // A가 B보다 크다면
		cout << ">";
	}
	if(A<B){ // B가 A보다 크다면
		cout << "<";
	}
	return 0;
}

A>BA<B 두 구문은 수학에서도 일반적으로 사용하고 있고,
A==B 는 A와 B가 같을 때를 의미하는 조건입니다.

각각의 조건이 맞을때 해당하는 {} 블록을 실행시키고,
그 블록들은 위에서 아래로 실행되며 출력문을 실행시킵니다.

조건문 else

if구문은 확장이 가능합니다.
확장을 통해 else 구문을 추가하면 다음과 같습니다.

if(조건){
	실행할 내용1
}
else{
	실행할 내용2
}

if문 안의 조건이 충족될 때에는 if문 뒤의 블록을 실행시키고
if문 안의 조건이 충족되지 못할때는, else문 뒤에 붙어있는 블록을 실행시킵니다.

반드시 두개 중 하나는 실행되며,
둘 모두가 실행되지 못하거나 둘 모두가 실행되는 경우는 존재하지 않습니다.

조건문 else if

한번 더 확장할 시 다음과 같아집니다.

if(조건1){
	실행할 내용1
}
else if(조건2){
	실행할 내용2
}
else{
	실행할 내용3
}

조건1은 충족시키지 못했지만, 조건 2는 충족시킨 경우 else if 구문 뒤의 블록이 실행됩니다.

논리연산자

if문을 사용한 보다 복잡한 프로그램을 작성할 때에는, 해당 블록의 실행 여부 를 결정시키는 "조건" 의 역할이 중요하게 됩니다.

C++에서는 이러한 조건을 논리연산자 라는 방법으로 구현했고,
연산자 의 맥락에서 보듯 일반적인 사칙연산과 똑같이 소괄호 () 으로 묶어 우선순위를 줄 수도 있습니다.

숫자 등의 일반적인 값에 대한 논리 연산자의 종류는 다음과 같습니다

  • A == B 어떠한 두 값 A와 B가 서로 같음
  • A < B A보다 B가 더 큼
  • A > B A가 B보다 더 큼
  • A <= B A보다 B가 더 크거나 같음
  • A >= B A가 B보다 더 크거나 같음
  • A != B A와 B가 서로 같지 않음 ( A==B 의 반대 )

이렇게 두 값을 비교했을때, 조건에 맞다면 1(True) 를, 조건에 맞지 않다면 0(False) 라는 값을 가지게 됩니다.

계산한 논리값에 대해서도 연산을 진행할 수 있습니다.
논리값에 대한 논리연산자의 종류는 다음과 같습니다

  • !A 논리값 A의 반대(T->F, F->T)
  • A && B 논리값 A와 B가 모두 참이어야 함 (A 그리고 B)
  • A || B 논리값 A와 B중 하나만 참이면 됨 (A 또는 B)

이 논리연산자를 적절히 조합하면

2753번: 윤년

문제를 해결할 수 있습니다.

#include <iostream>
using namespace std;

int main(){
	int year;
	cin >> year;
	if((year%4==0 && year%100!=0)||year%400==0){
		cout << 1;
	}
	else{
		cout << 0;
	}
	return 0;
}

윤년의 조건은

  • 년도가 4의 배수이면서
  • 년도가 100의 배수는 아니고
  • 년도가 400의 배수이면 포함

첫 번째 조건은 year%4==0 이라는 논리식으로 구성되었고,
두 번째 조건은 year%100!=0 이라는 논리식으로 작성했습니다.

이 두 조건은 둘 모두 성립해야 윤년이기 때문에 && 으로 연결해주고, 이 조건을 먼저 계산하기 위해서 ()으로 한번 감싸주었습니다.

세 번째 조건은 앞선 조건과 관계없이 년도가 400의 배수이면 포함시키기 때문에 || 연산자로 연결시켰고, year%400==0 이라는 논리식을 사용했습니다.

결론

조건문과 논리식은 프로그램의 흐름을 결정지을 수 있다는 강력한 역할을 가지기 때문에, 앞으로 더없이 자주 사용하게 될 것입니다.

그와 동시에 논리식을 작성해서 프로그램을 작성하는 부분부터는 개발자의 주관이 들어갈 수 있어서, 언어 사용 능력이 아닌 프로그래밍 실력에 영향을 받기 시작하는 부분이기도 합니다.

외국어에 비교하자면 드디어 기초적인 단어 정도를 떼고, "회화" 라는것을 준비해볼 수 있게 되었다의 느낌입니다.

본 개념을 사용하면, 문제 > 새싹 > 조건 부분을 해결하실 수 있습니다.
이쪽은 전부 풀어보시는걸 추천드립니다.