hyelie
hyelie
Hyeil Jeong
       
글쓰기    관리    수식입력
  • 전체보기 (495)
    • PS (283)
      • Algorithm (28)
      • PS Log (244)
      • Contest (6)
      • Tips (5)
    • Development (52)
      • Java (14)
      • Spring (23)
      • SQL (2)
      • Node.js (2)
      • Socket.io (3)
      • Study (4)
      • Utils (4)
    • DevOps (36)
      • Git (5)
      • Docker (4)
      • Kubernetes (2)
      • GCP (3)
      • Environment Set Up (8)
      • Tutorial (12)
      • Figma (2)
    • CS (74)
      • OOP (7)
      • OS (24)
      • DB (2)
      • Network (24)
      • Architecture (0)
      • Security (2)
      • Software Design (0)
      • Parallel Computing (15)
    • Project (15)
      • Project N2T (5)
      • Project ASG (0)
      • Project Meerkat (1)
      • Model Checking (7)
      • Ideas (2)
    • 내가 하고싶은 것! (34)
      • Plan (16)
      • Software Maestro (10)
      • 취준 (8)
hELLO · Designed By 정상우.
hyelie

hyelie

PS/PS Log

22.05.12. 풀었던 문제들

1. 스티커 모으기(2)

DP문제이다. dp[i]는 i번째 스티커까지 봤을 때 최댓값이라고 두면 점화식은 dp[i] = max(dp[i-1], dp[i-2] + sticker[i])이다. max 함수에서 전자는 i번째 스티커를 떼지 않는 경우이고 후자는 i번째 스티커를 떼는 경우이다. 그리고 이 문제의 경우 0번째 스티커를 떼면 마지막 것을 떼지 못하므로 이에 대한 예외처리도 해 주어야 한다.

​

​

2. 기지국 설치

그냥 풀면 되는 문제.

​

​

3. 스타 수열

꽤 빡셌다. 일단 모든 숫자들이 나온 횟수를 저장하고, 모든 숫자로 brute-force하게 탐색해야 하는 건 맞다. 그러나 조금 최적화가 빡셌다. 마음같아서는 a배열 한번만 탐색하면서 찾는 방법을 찾고 싶은데....

// 스타 수열

#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <map>
#include <cmath>

using namespace std;

typedef pair<int, int> pii;

bool cmp(pii &a, pii &b){
    return a.second > b.second;
}

int solution(std::vector<int> a) {
    map<int, int> m;
    int size = a.size();
    for(int i : a) m[i]++;
    
    int answer = 0;
    for(pii p : m){
        int value = p.first;
        if(2 * p.second <= answer) continue;
        int max_len = 0;
        for(int j= 0; j<size-1; j++){
            if(a[j] == a[j+1]) continue; // 수가 같은 경우 - 어차피 스타수열이 될 수 없음
            if(a[j] != value && a[j+1] != value) continue; // 두 수 다 스타수열이 아닌 경우 - 스타수열이 될 수 없음
            j++; max_len += 2;
        }
        answer = max(max_len, answer);
    }
    
    return answer;
}

 

4. 가장 긴 팰린드롬

처음 작성했던 코드. 그냥 무작정 때려박았다

 

// 가장 긴 팰린드롬

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

bool isPalin(string s){
    int len = s.length(), mid = len / 2; // 4면 2, 5면 2
    string back;
    if(len & 1){
        back = s.substr(mid+1, mid);
    } else{
        back = s.substr(mid, mid);
    }
    reverse(back.begin(), back.end());
    if(s.substr(0, mid) == back) return true;
    else return false;
}

int solution(string s)
{
    int answer = 0;
    int len = s.length();
    // 초기화
    for(int i = 0; i<len; i++){
        for(int j = len-1; j>=0; j--){
            if(j - i + 1 > answer && isPalin(s.substr(i, j - i + 1)))
                answer = max(answer, j-i+1);
        }
    }
    
    

    return answer;
}

// DP였던 것 같은데...
// dp[i][j] : i부터 j까지 max 팰린드롬
// 처음에는 i, i 접근
// 다음에는 i, i+1 접근
// 그 다음에는 i, i+2 접근. i는 row

 

그러나 이렇게 풀면, 팰린드롬을 검사하는 과정에서 s.length()만큼의 시간이 든다. 그러면 2500^3이라 시간 초과가 되는 것 같다. 음... 고민해 보자.

'PS > PS Log' 카테고리의 다른 글

22.05.14. 풀었던 문제들  (0) 2022.06.23
22.05.13. 풀었던 문제들  (0) 2022.06.23
22.05.10. 풀었던 문제들  (0) 2022.06.23
22.05.09. 풀었던 문제들  (0) 2022.06.23
22.05.08. 풀었던 문제들  (0) 2022.06.23
    hyelie
    hyelie

    티스토리툴바