본문 바로가기
Problem Solving

[C++] [LeetCode 1154] Day of the Year (pps 5-4)

by tls1107 2021. 7. 18.
728x90
반응형


문제 풀기 전 생각 : 

/*
예전에 날짜 구하는 문제를 수업과제로 해본 적이 있어서 
푸는 방법을 알고 있었다.
대신 입력받은 date를 year month day로 나눠야 한다.
이 부분은 split이 없으니 직접 반복문으로 처리해줘야 한다.
*/

#include <string>

class Solution {
public:
    int dayOfYear(string date) {
        int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
        int ymd[3];
        int i=0,answer=0;
        string tmp = "";
        date += '-';
        
        for(int j=0 ; j<11 ; j++){
            if(date[j] != '-') tmp += date[j];
            else {
                ymd[i] = stoi(tmp);
                tmp = "";
                i++;
            }
        }
        if(ymd[0]%400 == 0 || (ymd[0]%100!=0 && ymd[0]%4==0) ) days[1] = 29;

        for(int j=0 ; j<ymd[1]-1 ; j++){
            answer += days[j];
        }
        answer += ymd[2];
        
        return answer;
    }
};

https://leetcode.com/problems/day-of-the-year/

 

Day of the Year - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com


풀 때 어려웠던 점 또는 느낀점 :

 

c++에는 split 기능이 없어서

직접 그 기능을 구현해서 사용해야 한다는 점이

참 불편하다 자바나 파이썬 코드를 보다 시플플 보면 

답답한것이 이런 것들이 모여서 인듯 하다.

그래도 이가 없으면 잇몸으로라도 풀어야지..


개선방안 :

class Solution {
public:
    int dayOfYear(string date) 
    {
        int y = stoi(date.substr(0, 4)), m = stoi(date.substr(5, 2)), d = stoi(date.substr(8, 2));
        d += m < 9 ? (m/2) * 31 : ((m + 1)/2) * 31;
        if(m >= 3)d += 28, d += m < 9 ? max(0, (((m + 1)/2) - 2) * 30) : (((m/2) - 2) * 30);
        if(y % 4 == 0 && m > 2)++d;
        return d;
    }
};

삼항 연산자를 잘 사용하면 저렇게 간단하게도 풀수 있구나 

신기하구만요 substr() 함수를 사용하는 방법도 있는지 이제야 생각났다

담에는 더 잘 풀어야지

728x90
반응형

댓글