이 튜토리얼에서는 C++를 사용하여 24시간제(HH:MM:SS)로 표현된 시간을 오전·오후 표시가 포함된 12시간제 형식으로 변환하는 프로그램을 만드는 방법을 알아봅니다.
입력으로는 24시간제 형식의 시간 문자열이 주어지며, 우리의 목표는 여기에 "AM"(오전) 또는 "PM"(오후) 표기를 덧붙인 12시간제 형식으로 바꾸는 것입니다. 예를 들어 "17:35:20"은 "5:35:20 PM"으로 변환되어야 합니다.
변환 원리
변환 로직은 생각보다 간단하며, 다음 세 가지 규칙만 기억하면 됩니다.
- AM/PM 판별: 시(hour) 값이 12보다 작으면 "AM", 12 이상이면 "PM"입니다.
- 시 값 보정: 시 값을 12로 나눈 나머지를 사용합니다. 예를 들어 17시는 17 % 12 = 5시가 됩니다.
- 특수 경우 처리: 나머지가 0이 되는 경우(자정 00시, 정오 12시)는 관례상 "12"로 표시합니다.
분과 초는 어느 형식에서든 동일하게 유지되므로, 문자열에서 해당 부분을 그대로 가져와 출력하면 됩니다.
예제 코드
#include <bits/stdc++.h>
using namespace std;
// 24시간제를 12시간제로 변환하는 함수
void convert_12hour(string str) {
int h1 = (int)str[0] - '0';
int h2 = (int)str[1] - '0';
int hh = h1 * 10 + h2;
// 오전(AM)/오후(PM) 판별
string meridiem;
if (hh < 12)
meridiem = "AM";
else
meridiem = "PM";
hh %= 12;
// 자정(00시)과 정오(12시)는 12로 표시
if (hh == 0)
cout << "12";
else
cout << hh;
// 분과 초는 그대로 출력
for (int i = 2; i < 8; ++i)
cout << str[i];
cout << " " << meridiem << '\n';
}
int main() {
string str = "17:35:20";
convert_12hour(str);
return 0;
}
코드 설명
- 문자열의 첫 두 문자를 각각 숫자로 변환한 뒤
h1 * 10 + h2연산으로 두 자리 시(hour) 값을 만듭니다. - 시 값이 12 미만인지 비교하여 "AM" 또는 "PM"을 결정합니다.
- 시 값을 12로 나눈 나머지로 바꾸고, 결과가 0이면 "12"를 대신 출력합니다.
- 나머지 문자열(콜론, 분, 초)을 그대로 출력한 뒤 AM/PM 표기를 덧붙여 완성합니다.
출력 결과
5:35:20 PM
마무리
입력 문자열의 길이가 항상 고정되어 있으므로 이 알고리즘의 시간 복잡도는 O(1)로, 상수 시간 안에 변환이 완료됩니다. 실제 프로젝트에 적용한다면 입력 형식 검증(시·분·초 범위 확인 등)을 추가하여 더 견고한 코드로 발전시킬 수 있습니다.