2023년 1월 ~ 2월에 프로그래밍을 공부하기 위해 풀었던 문제들이다.
어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 반에 있는 학생의 수 n이 주어진다. (1 ≤ n ≤ 100)
다음 n개 줄에는 각 학생의 이름과 생일이 "이름 dd mm yyyy"와 같은 형식으로 주어진다. 이름은 그 학생의 이름이며, 최대 15글자로 이루어져 있다.dd mm yyyy는 생일 일, 월, 연도이다. (1990 ≤ yyyy ≤ 2010, 1 ≤ mm ≤ 12, 1 ≤ dd ≤ 31) 주어지는 생일은 올바른 날짜이며, 연, 월 일은 0으로 시작하지 않는다.
이름이 같거나, 생일이 같은 사람은 없다.
출력
첫째 줄에 가장 나이가 적은 사람의 이름, 둘째 줄에 가장 나이가 많은 사람 이름을 출력한다.
배열 사용시 앞뒤를 비교하면서 index에서 자꾸 오버플로우가 나는 문제를 해결하기 위해 처음으로 max사용+배열유지 가 아닌 배열을 사용하지 않는 법에 대해서 고민해 보았던 문제이다. 이 문제는 비교해야할게 많기 때문에 비교시에 문제가 생기지 않게하려면 약 6개의 변수가 추가가 되어야 했다. 그러나 그것은 매우 무리라고 생각했기에 다른 방법을 고민하다가 사실 내가 필요한것은 모든 값의 저장이 아닌 필요한 값만 저장해서 비교하고 내가 찾는 가장 큰, 가장 작은 수치와 관련있는 수가 아니라면 버려도 되니 변수 하나에 저장하고 필요에 따라 수를 바꾸는 방법을 생각했다.
if
문이 너무 많아서 지져분하고 변수도 줄였지만 꽤 많은편이라 복잡한게 아쉬웠다. 다음에는 좀 더 간단히 할 수 있는 방법을 모색해 보고 싶다.
// 생일
#include <iostream>
using namespace std;
int main() {
int student, year, month, day, beforeY, beforeM, beforeD, beforeY1, beforeM1, beforeD1;
string name, minName, maxName;
cin >> student;
// 가장 적은 사람 구하기
for (int i = 0; i < student; i++) {
cin >> name >> day >> month >> year;
if (i == 0) {
beforeD = day, beforeM = month, beforeY = year;
minName = name;
}
else {
if (beforeY < year) {
beforeY = year;
beforeM = month;
beforeD = day;
minName = name;
}
else if (beforeY == year) {
if (beforeM < month) {
beforeM = month;
beforeD = day;
minName = name;
}
else if (beforeM == month) {
if (beforeD < day) {
beforeD = day;
minName = name;
}
}
}
}
// 가장 많은 사람 구하기
if (i == 0) {
beforeD1 = day, beforeM1 = month, beforeY1 = year;
maxName = name;
}
else {
if (beforeY1 > year) {
beforeY1 = year;
beforeM1 = month;
beforeD1 = day;
maxName = name;
}
else if (beforeY1 == year) {
if (beforeM1 > month) {
beforeM1 = month;
beforeD1 = day;
maxName = name;
}
else if (beforeM1 == month) {
if (beforeD1 > day) {
beforeD1 = day;
maxName = name;
}
}
}
}
}
cout << minName << '\n' << maxName;
}