2020-11-08 고급프로그래밍

Hyeonu_Chun·2021년 6월 22일
0

Absolute C++ 6th ed./Savitch Chap.9 Programming Project.6

  1. 문제 기술
    필자는 음악리스트를 각 조건에 맞는 연산을 수행하여 정렬하기를 원한다.

  2. 설계 계획
    각 조건에 맞게 설계하기 위해서 string 배열타입의 음악리스트를 변수로 입력한다. 조건에 맞게끔 변수를 조정하여 정렬하기 쉬운 형태로 변경하고, 이후 알고리즘 헤더의 sort함수를 이용해 정렬한다.

  3. 데이터 처리 과정
    String 타입의 배열을 만들어 각각의 방에 음악 타이틀을 하나씩 넣어 변수로 입력한다. 사용자가 원하는 타이틀의 개수를 num이라는 변수에 저장해 타이틀을 추가해도 반자동적으로 타이틀의 개수를 체크한다. 우선적으로, 타이틀 앞의 무의미한 정보를 삭제하기 위해 ‘.’앞뒤의 글자를 제거한다. 타이틀 내의 타이틀과 뮤지션을 나뉘어 주는 대쉬 표시를 헷갈리게 하지 않기 위해 타이틀 내의 대쉬 표시를 공백으로 전환하고, 동시에 중복되는 공백표시를 제거해 하나의 공백으로 변경한다. 변경된 정보들을 가지고 제목정렬을 한 뒤 번호를 붙인다.

  4. 실행 결과 및 분석

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

bool comp(string s1, string s2) {
	return s1 < s2;
}

int main() {
	string line[] = {"1. Adagio \"Moon\" - Ludwig Van Beethoven","15. Dutch  Warblet - no author   listed", "123. Ba- Be- -  no author listed"};
	const int num = sizeof(line) / sizeof(line[0]);
	for (int i = 0; i < num; i++) cout << line[i] << endl;
	cout << endl;

	for (int i = 0; i < num; i++) {
		line[i].erase(0, line[i].find(".") + 2);
		bool a = false;
		int b = 0;
		for (int j = line[i].size() - 1; j >= 0; j--) {
			if (line[i].at(j) == '-' && !a) {
				a = true;
				b = j;
			}
			else if (line[i].at(j) == '-' && a) {
				line[i].at(j) = ' ';
			}
			if (j <= line[i].size() - 2 && j >= 1) {
				if (line[i].at(j) == ' ') {
					if (line[i].at(j - 1) == ' ' || line[i].at(j + 1) == ' ') line[i].erase(j, 1);
				}
			}
		}
	}
	sort(line, line + num, comp);
	for (int i = 0; i < num; i++) cout << i + 1 << ". " << line[i] << endl;
}


조건에서 이해 가능한 조건을 우선적으로 실행하여 구현하였다. 제목정렬이 아닌 가수정렬로 바꿀 시 rfind 함수를 이용해 대쉬 표기를 찾아 가수와 제목의 위치를 바꾸고 sort 함수를 이용해 정렬하면 가수정렬도 가능하지만, 조건들에 있는 첫번째/두번째 이니셜과 이름의 위치 바꾸는 로직을 이해하지 못해 구현하지 않았다.

profile
Stay hungry, stay foolish

0개의 댓글