새소식

코딩테스트/프로그래머스

[C++] 개인정보 수집 유효기간

  • -

[문제]

코딩테스트 연습 - 개인정보 수집 유효기간 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[문제 풀이]

privacies "2021.05.02 A"라는 변수가 주어지고 "A 6"이라는 조건이 넣어지는 변수가 주어진다.

알파벳은 날짜에서 월을 숫자만큼 움직이고 그 결과가 today "2022.05.19" 이하이면 result에 해당 인덱스를 넣어주면 된다.

 

문제 자체가 어렵진 않지만 구현이 까다로워서 어떻게 해야 더 간단하게 풀 수 있을까 고민을 하는 문제이다.

 

우선 terms 변수에서 앞과 뒤를 " "공백을 기준으로 split을 해주고 싶다.

만일 split을 안하고 단순히 terms[0][0], terms[0][2] 식으로 문제를 풀면 숫자가 2자리 이상이 오는 순간 조건을 추가하면서 코드를 더 헷갈리게 만들어 줄 수 있기에 terms를 split을 이용해서 나누기로 했다.

 

그 후 마찬가지로 privacies도 공백을 기준으로 나누고 map을 이용해서 terms 변수에서 알파벳과 숫자를 연결하였다.

이후 today의 문자열을

string.substr(원하는 인덱스 위치, 몇개만큼 자를 것인지 n개)

substr와 string을 int로 타입을 바꿔주는 stoi를 사용해서 date 변수에 today를 year * 12 * 28 + month * 28 + day로 만들어서 날짜를 숫자로 만들었다.

 

이후 privacies를 반복문을 통해서 방문하면서 today에서 사용했던 방식을 그대로 이용해 파악을 하면서 today 이하이면 i + 1을 answer에 넣어주자.

[회고]

문자열 문제는 사실 어떻게든 푸는건 어렵지 않다.

다만, 코테를 생각하면 보다 쉽고 빠르게 풀 수 있는 방법이거나 대부분의 문제에서 응용이 가능한 방식으로 푸는 것이 좋다.

해당 문제에서는 "07"의 형태로 날짜를 주어졌지만 만일 "2022.5.12"의 형태로 주어졌다면 split을 다중인자를 받게 해서 '.'과 ' '두가지를 모두 나눈뒤에 문제를 푸는 연습도 하는 것이 좋을 것이다.

[코드]

#include <string>
#include <vector>
#include <iostream>
#include <sstream>
#include <map>
using namespace std;

vector<string> split(string s){
    vector<string> answer;
    istringstream iss(s);
    string buffer;
    char delimeter = ' ';
    
    while(getline(iss,buffer,delimeter)){
        answer.push_back(buffer);
    }
    
    return answer;
}

vector<int> solution(string today, vector<string> terms, vector<string> privacies) {
    vector<int> answer;
    vector<vector<string> > term;
    vector<vector<string> > info;
    map<string, int> pass;
    
    //today를 날짜로 바꾸자.
    int date = stoi(today.substr(0,4)) * 12 * 28 + stoi(today.substr(5,2)) * 28 + stoi(today.substr(8,2));
    
    //privacies 나누기.
    for(int i = 0;i<privacies.size();i++){
        info.push_back(split(privacies[i]));
    }
    //terms 나누기
    for(int i = 0;i<terms.size();i++){
        term.push_back(split(terms[i]));
    }
    //term의 알파벳이 나타내는 숫자를 map을 이용해서 선언하자.
    for(int i = 0;i<term.size();i++){
        pass[term[i][0]] = stoi(term[i][1]);
    }
    
    for(int i = 0;i<info.size();i++){
        int total = 0;
        int year, month, day;
        year = stoi(info[i][0].substr(0,4));
        month = stoi(info[i][0].substr(5,2));
        //뒤의 알파벳이 의미하는 숫자들 추가로 더해주자.
        month += pass[info[i][1]];
        day = stoi(info[i][0].substr(8));
        
        total = year * 12 * 28 + month * 28 + day;
        
        if(total <= date)
            answer.push_back(i + 1);
    }    
    
    return answer;
}

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.