https://www.acmicpc.net/problem/5635
5635번: 생일
어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.
www.acmicpc.net
C++로 백준 5635번 문제를 풀어보겠다.
문제
어떤 반에 있는 학생들의 생일이 주어졌을 때, 가장 나이가 적은 사람과 가장 많은 사람을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 반에 있는 학생의 수 n이 주어진다. (1 ≤ n ≤ 100)
다음 n개 줄에는 각 학생의 이름과 생일이 "이름 dd mm yyyy"와 같은 형식으로 주어진다. 이름은 그 학생의 이름이며, 최대 15글자로 이루어져 있다. dd mm yyyy는 생일 일, 월, 연도이다. (1990 ≤ yyyy ≤ 2010, 1 ≤ mm ≤ 12, 1 ≤ dd ≤ 31) 주어지는 생일은 올바른 날짜이며, 연, 월 일은 0으로 시작하지 않는다.
이름이 같거나, 생일이 같은 사람은 없다.
출력
첫째 줄에 가장 나이가 적은 사람의 이름, 둘째 줄에 가장 나이가 많은 사람 이름을 출력한다.
예제 입력 1 복사
5
Mickey 1 10 1991
Alice 30 12 1990
Tom 15 8 1993
Jerry 18 9 1990
Garfield 20 9 1990
예제 출력 1 복사
Tom
Jerry
<문제 풀이>
1. 몇 명을 비교할 것인지 n 값을 입력받는다.
2. 먼저 한 명의 {name, day, month, year} 값만을 입력받고, 각각을 min, max값에 대입해 초기화해준다.
이 코드가 while문 밖에 있는 이유는 while문이 돌 때 비교할 값을 정해야하기 때문이었다.
3. while문을 n-1번 반복한다.
while문을 돌리며 n-1명의 {name, day, month, year} 값을 입력받고, min, max를 상황에 따라 갱신해준다.
4. 기존의 값과 새로 입력받은 값을 비교해 min, max값을 알맞게 갱신한다.
값은 year->month->day 순으로 비교하고, 값을 갱신해야한다면 name도 함께 저장해준다.
year이 다르면 year만 비교하고 넘어가도 되지만 year이 같다면 month을 비교해야한다.
또, month가 다르면 month만 비교하고 넘어가도 되지만 month가 같다면 day를 비교해야한다.
이런 순서를 통해 나이가 더 적은지 더 많은지, min max값을 구한다.
5. while문이 다 끝나면 while문 밖에서 나이가 가장 적은 사람, 나이가 가장 많은 사람 순으로 출력한다.
이 문제에서 헷갈렸던 부분은 min과 max이다. 나이가 가장 어리려면 생일 값이 가장 커야하고, 나이가 가장 많으려면 생일 값이 가장 작아야한다. 상관관계가 반대이기 때문에 이 부분을 잘 생각해 코드를 짜야했다.
또, 코드를 보면 반복되는 부분이 있다는 것을 알 수 있다. 여러 조건에 따라 값을 계속 초기화해주어야 하기 때문에
minname = name;
minday = day;
minmonth = month;
minyear = year;
maxname = name;
maxday = day;
maxmonth = month;
maxyear = year;
위와 같은 코드가 반복된다. 이런 부분을 간결하게 하고 코드의 가독성을 높이기 위해 다음 번엔 함수를 사용도 고려해야겠다고 생각했다.
코드는 다음과 같다.
'C++' 카테고리의 다른 글
[백준 알고리즘] 2739번 : 구구단, c++ (0) | 2022.01.03 |
---|---|
[백준 알고리즘] 2742번 : 기찍 N, C++ (0) | 2022.01.03 |
[백준 알고리즘] 2741번 : N 찍기, C++ (0) | 2022.01.03 |
[백준 알고리즘] 11098번 : 첼시를 도와줘!, C++ (0) | 2022.01.01 |
[백준 알고리즘] 1997번 : 완전제곱수, C++ (0) | 2022.01.01 |