혜지와 콩나무

[C++] 일반 정렬 문제 / bool 함수 이용해 세련된 코드로 본문

Programming/C++

[C++] 일반 정렬 문제 / bool 함수 이용해 세련된 코드로

혜지콩 2024. 9. 15. 18:44

문제는 다음과 같다.

 

 

이 문제에 대하여 나는 다음과 같이 풀이했다.

 

#include<iostream>
#include<algorithm>
using namespace std;

//수열의 최대 크기
#define MAX_PROG 100

int main(){
    int PROG_A[MAX_PROG];
    int PROG_B[MAX_PROG];
    int n;
    cin>>n;
	
    //A배열 채우기
    for(int i = 0; i<n; i++){
        cin>>PROG_A[i];
    }
    //A배열 오름차순 정렬하기
    sort(PROG_A, PROG_A+n);
	
    //B배열 채우기
    for(int i = 0; i<n; i++){
        cin>>PROG_B[i];
    }
    //B배열 오름차순 정렬하기
    sort(PROG_B, PROG_B+n);

	//A, B배열 비교하기
    for(int i = 0; i<n; i++){
    	//순서대로 비교하다가 다르면 No 출력하고 빠져나오기
        if(PROG_A[i]!=PROG_B[i]){
            cout<<"No";
            break;
        }
        //i가 n-1번째인 때에 도달하게 되면 Yes 출력하고 빠져나오기
        if(i==n-1){
            cout<<"Yes";
            break;
        }
    }

    return 0;
}

 

답은 맞지만 뭔가 조잡하게(?) 풀이한 기분이 들어서 해설을 보았다.

 

#include <iostream>
#include <algorithm>

#define MAX_N 100

using namespace std;

int n;
int a[MAX_N], b[MAX_N];

bool Equal() {
    // n개의 원소를 순서대로 봤을 때
    // 전부 동일한 경우에만 일치합니다.
    // 단 하나라도 다르다면, false입니다.
    for(int i = 0; i < n; i++)
           if(a[i] != b[i])
                 return false;
    
    return true;
}

int main() {
    // 입력
    cin >> n;
	
	for(int i = 0; i < n; i++)
	    cin >> a[i];
	for(int i = 0; i < n; i++)
            cin >> b[i];
	
    // 정렬
	sort(a, a + n);
	sort(b, b + n);
    
    // 수열이 일치하는지 확인합니다.
    if(Equal())
        printf("Yes");
    else
        printf("No");
    return 0;
}

 

여기에서 나와 중요하게 다른 점은, bool 자료형 함수를 사용했다는 점이다.

함수를 이용하니 훨씬 깔끔한 코드가 완성된 것을 알 수 있다.

이 함수는 아래의 작동 과정을 거친다.

 

  • 함수는 정수 n을 기준으로 a와 b 배열의 원소를 비교한다.
  • for 루프를 사용하여 배열의 모든 인덱스 i에 대해 a[i]와 b[i]의 값을 비교한다.
  • 만약 a[i]와 b[i]가 서로 다르면, 배열이 동일하지 않으므로 false를 반환한다.
  • 모든 원소를 비교한 후에도 다름이 발견되지 않으면, 배열이 동일하다는 의미이므로 true를 반환한다.

main 내부에서는, bool 함수와 관련하여

 

  • if (Equal()): Equal() 함수가 true를 반환하면 if 블록이 실행된다.
  • else: Equal() 함수가 false를 반환하면 else 블록이 실행된다.

위의 과정을 거친다.

 

따라서 좀 더 세련된 방식으로 코드를 구현할 수 있다.

코드를 블록 형태로 구상하는 습관을 들여야겠다.