-
CS50 Week1: Lab1, Population GrowthProgramming/CS50 2023. 7. 2. 00:26
하버드 CS50 1주차 Lab 과제 Population Growth 의 풀이 과정을 다룹니다.
C언어로 기초적인 입출력과 숫자 연산을 수행하는 문제입니다.Intro
문제 링크에서 자세한 내용을 확인할 수 있습니다.
Task
지구 어디선가 라마가 번식하며 살고 있다.초기 시점 라마 수(Start size)와 목표 라마 수(End size)가 주어질 때 목표 수에 도달하는 데 걸리는 연도를 계산하는 문제
$ ./population Start size: 100 End size: 200 Years: 9
Details
라마의 번식
N 마리 라마 집단을 기준으로, 매년 N/3 마리의 라마가 태어나고, N/4 마리의 라마가 사망한다.
나머지는 버려진다. 즉 N=9 일 때 새로 태어나는 라마는 3마리, 사망하는 라마는 2마리가 된다.
사용자 입력
Start size가 9 미만일 경우 라마 개체 수는 꾸준히 증가하지 않고 어느 한 값으로 수렴한다.
따라서 다시 입력 받도록 한다.End size가 Start size 보다 작을 경우 개체 수에 이미 도달했기에 다시 입력 받는다.
Implementation
사용자 입력 구현
Start Size와 End Size 사용자 입력을 받아야 한다.
CS50 라이브러리 안에 정수 값을 받아주는
get_int
함수가 있으니 활용해준다.입력은 특정 조건(9이상, Start size 이상)을 만족할 때까지 반복해서 받아야 한다.
명령을 최소 1번 이상은 수행해야 하기에 기본 for, while 루프 보다는 일단 명령을 실행해버리고 이후에 조건을 비교하는 do while 루프를 쓰는 게 확실히 깔끔했다.
다만 생긴 게 조금 마음에 안 든다.두 입력 모두 최소 값 이상을 받아야 한다는 논리적 공통점이 있어서
get_size()
함수를 정의해서 사용했다.// Prompts user for an integer greater than or equal to min_size int get_size(int min_size, string prompt) { int size; do { size = get_int(prompt); } while (size < min_size); return size; }
// Population becomes stagnant with start size less than 9 const int MIN_START_SIZE = 9; // Prompt user for start and end size of population int start_size = get_size(MIN_START_SIZE, "Start size: "); int end_size = get_size(start_size, "End size: ");
연도 계산/출력 구현
목표 개체 수에 도달할 때까지 매년 개체 수를 업데이트하고, 걸린 연도를 출력한다.
개체 수를 업데이트 할 때 단순히 N = N + N/12 와 같이 처리하면 안된다.
N을 12로 나눈 나머지가 가령 3, 6, 7, 9, 10, 11 이면 N/3 - N/4 와 N/12의 값에 차이가 발생하기 때문이다 (Floor division 기준)
그 외 특이사항은 없다.
int years = 0; int current_size = start_size; while (current_size < end_size) { current_size = current_size + current_size / 3 // Births - current_size / 4; // Deaths, truncated to integer years++; } printf("Years: %i\n", years);
Code
// Calculates the years required for a population of llamas to reach a particular size #include <stdio.h> #include "cs50.h" int get_size(int min_size, string prompt); int main(void) { // Population becomes stagnant with start size is less than 9 const int MIN_START_SIZE = 9; // Prompt user for start and end size of population int start_size = get_size(MIN_START_SIZE, "Start size: "); int end_size = get_size(start_size, "End size: "); int years = 0; int current_size = start_size; while (current_size < end_size) { current_size = current_size + current_size / 3 // Births - current_size / 4; // Deaths, truncated to integer years++; } printf("Years: %i\n", years); } // Prompts user for an integer greater than or equal to min_size int get_size(int min_size, string prompt) { int size; do { size = get_int(prompt); } while (size < min_size); return size; }