백준 연습

2920번 음계 (블락 적절히 나누기!)

빙하둘리 2022. 8. 21. 17:04
728x90

의문사항

두번째 조건문에 else if를 넣었을 때와 if문을 넣었을 때 결과가 다른 이유?

#include <stdio.h>
#include <iostream>

using namespace std;

int ele(int* arr)
{
	for (int i = 1; i < 8; i++)
	{
		if (arr[i] != arr[i - 1] + 1)
			return 0; // 상승세가 아닌 즉시 0을 리턴하자.
	}
	return 1; //상승세면 1
}
int down(int* arr)
{
	for (int i = 1; i < 8; i++)
	{
		if (arr[i] != arr[i - 1] - 1)
			return 0; //하락세가 아닌 즉시 0을 리턴하자
	}
	return 1; // 하락세면 1
}

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	//new로 동적할당 해볼까?
	int arr[8] = { 0, };
	for (int i = 0; i < 8; i++) {
		cin >> arr[i];
	}

	int dn = down(arr);
	int up = ele(arr);

	if  (dn == 1)
		cout << "descending";
	else if (up == 1) // else if 할 때는 멀쩡한데 if 하면 이상해요
		cout << "ascending";
	else
		cout << "mixed"; // 87654321이 왜?

	return 0;
}

if문안에 if(strlen(arr)) 이런 식으로 부르면 시간 복잡도가 커지기 때문에 int 변수=함수; 이렇게 값을 뺐다. 

 

내 것 디버깅 해보자!

#include <stdio.h>
#include <iostream>

using namespace std;

int ele(int* arr)
{
	for (int i = 1; i < 8; i++)
	{
		if (arr[i] != arr[i - 1] + 1)
			return 0; // 상승세가 아닌 즉시 0을 리턴하자.
	}
	return 1; //상승세면 1
}
int down(int* arr)
{
	for (int i = 1; i < 8; i++)
	{
		if (arr[i] != arr[i - 1] - 1)
			return 0; //하락세가 아닌 즉시 0을 리턴하자
	}
	return 1; // 하락세면 1
}
//while문으로 돌려볼까?
int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	//new로 동적할당 해볼까?
	int arr[8] = { 0, };
	for (int i = 0; i < 8; i++) {
		cin >> arr[i];
	}


	int dn = down(arr);
	int up = ele(arr);
	
	if (dn == 1)
		cout << "descending " << "dn과 up은 "<<"->"<<dn << "&"<<up<<"\n";

	//**아래의 if else문이 한 블락처럼 실행된다.
	if (up == 1) // else if 할 때는 멀쩡한데 if 하면 이상한 이유, if else가 한 블락처럼 있어서
		cout << "ascending " << "dn과 up은 " << "->" << dn << "&" << up << "\n";
	else
		cout << "mixed " << "dn과 up은 " << "->" << dn << "&" << up << "\n"; // 87654321이 왜?

	//dn과 up값은 함수 호출 후 저장한 값이어서 if문 다음에 if else를 실행한다고 해서 값이 달라지지 않는다.

	return 0;
}

 

if문 if문 else문 이렇게 있으니

if문 실행 후 if else문을 실행하는 식으로 해서 저렇게 출력되는 것이다.

dn과 up 값은 함수 호출 후 저장한 값이어서 if문 다음에 if else를 실행한다고 해도 값은 그대로다.

 

조건이 여러 개 있을 때, if문 여러 개에 else문 하나 쓰지 말고

if {...} else if {...} else if {...} else if{...} 하고 마지막 조건은 else {...}로 마무리 해줘야한다.

 

[추가 자료]

https://transferhwang.tistory.com/81

링크를 걸은 포스팅은 if와 else의 차이점에 관한 포스팅인데, 변수에 초기화해준 값이 함수의 return 값이 아니라는 점이 내 코드와 좀 다르다.

그렇지만 if문else if문 대신 if문 if문을 사용하면, 두번째 if문은 참과 거짓에 상관없이 실행된다. 실행하면서 최대값, 최소값이 모두 갱신이 된다.

 

728x90