본문 바로가기

Programming/백준 문제풀이

백준 2884번 시계 세팅 문제 _ C++, python 두가지 풀이 비교.

문제: https://www.acmicpc.net/problem/2884

 

2884번: 알람 시계

문제 상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다. 이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다. 바로 "45분 일찍 알람 맞추기"이다. 이 방법은 단순하다. 원래 맞춰져있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피

www.acmicpc.net

이제 여유로울 때 백준 알고리즘 문제도 풀면서 하나씩 업로드를 해볼까해요.
요즘엔 C++도 다시 공부하고 있는데요, 때문에 앞으로 C++ 과 파이썬 두가지로 모두 풀이를 작성하면서 포스팅을 해보면 어떨까 하는 호기로운 생각도 해보았답니다. 오늘은 백준 알고리즘 첫 포스팅 2884번 시계 세팅 문제입니다.

이 문제를 처음으로 골랐던 이유는, 아무래도 제가 C++에 자료구조에는 덜 익숙해서 한번 클래스 개념을 잘 써먹어보고 싶다는 생각에 클래스를 이용하여 시계라는 객체를 생성하여 문제를 풀어보았는데요.

항상 늦잠자는 상근이 시계를 현재 시간보다 45분 전으로 맞추는 게 문제의 핵심이죠.
그렇다면 우리는 클래스가 먼저 아래를 생성해야 한다는 것을 알 수 있어요.

1. 현재 시간과 분
2. 시간을 핸들링할 수 있는 변수
3. 시간 핸들링 함수

그리고 한 가지 더 고려해야 할 것은 시계가 0시 0분보다 작으면 24시간이 더해져야하고 24시를 넘으면 24시간이 빼져야 한다는 것을 잊지 말아주셔야 해요.

바로 문제 코드를 보면서 비교해볼까요?
1. C++

#include <iostream>
using namespace std;

class Clock
{
private:
    int time; //hour*60 + min으로 총 시간을 핸들링 할 변수랍니다.
    int hour;
    int min;
public:
    Clock(int h, int m); //Clock객체의 생성자 선언
    void set_clock(int m=45); //45분 일찍 맞춘대서 디폴트를 45로 맞춰보았어요.
    void show();
};

int main(){
    int x,y;
    cin >> x >> y;
    Clock sangeun(x,y);
    sangeun.set_clock();
    sangeun.show();
    return 0;
}

Clock::Clock(int h, int m):hour(h), min(m) // 생성자
{
	time = 60*h + m;
}


void Clock::set_clock(int m){
    time = time - m; // 45분을 총 시간에서 빼준 뒤,
    if(time > 60*24) // 24시가 넘으면 24시간을 빼주고,
    {
        time = time - 60*24;
    }
    else if(time < 0) // 0시보다 작으면 24시간을 더해준다.
    {
        time = time + 60*24;
    }
    hour = time / 60;
    min = time % 60;
}

void Clock::show(){
    cout << hour << " " << min << endl;
}

 

이제 그럼 파이썬 코드도 한번 보실까요?

class Clock():
    def __init__(self, x, y): // 객체 생성자
        self.x = x
        self.y = y
        self.counter = 60*x +y
    def set_clock(self, m=45): // 시계 세팅 함수
        self.counter -= m
        if (self.counter>60*24): self.counter -= 60*24
        elif (self.counter<0): self.counter += 60*24
        self.x = self.counter // 60
        self.y = self.counter % 60

def main():
    x,y = map(int, input().split())
    sangeun = Clock(x,y)
    sangeun.set_clock()
    print(f'{sangeun.x} {sangeun.y}')

if __name__ == "__main__":
    main()

 

이렇게 한 문제를 똑같은 방법으로 풀고 비교해보았더니 신기한 결과가 나왔네요.

C++와 파이썬 코드 실행시간과 메모리 차이


C++와 파이썬으로 똑같이 작성한 코드가 메모리와 실행시간에 있어서 굉장히 큰 차이를 보여주네요.
이에 대한 포스팅은 다음에 다시 별도로 진행해보도록 하겠습니다 :)