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.04.04 풀었던 문제들

1. 쿼드 압축 후 개수 세기

backtrack을 이용해, 압축 가능하다면 탐색하지 않고, 압축 불가능하면 탐색하는 방식으로 진행하면 된다. 2중포문 안쓸려다가 시간 엄청나게 잡아먹은 문제. 생각해 보면, 모든 arr을 log(input size)만큼 탐색하는 것이므로 시간복잡도는 n^2logn이다. 입력이 1024까지니 이런 풀이가 가능함.

// 쿼드압축 후 개수 세기

#include <string>
#include <vector>

using namespace std;

void div(vector<vector<int>>& arr, vector<int>& answer, int r, int c, int size){
    if(size == 1){
        answer[arr[r][c]]++;
        return;
    }
    
    int base = arr[r][c];
    bool compressable = true;
    for(int i = r; i<r + size; i++){
        for(int j = c; j < c + size; j++){
            if(base != arr[i][j]){
                compressable = false;
            }
        }
    }
    
    if(compressable){
        answer[base]++;
    } else{
        int halfsize = size/2;
        div(arr, answer, r, c, halfsize);
        div(arr, answer, r + halfsize, c, halfsize);
        div(arr, answer, r, c + halfsize, halfsize);
        div(arr, answer, r + halfsize, c + halfsize, halfsize);
    }
    return;
}

vector<int> solution(vector<vector<int>> arr) {    
    vector<int> answer(2, 0);
    div(arr, answer, 0, 0, arr.size());
    return answer;
}

 

​

2. 교점에 별 만들기

구현이 귀찮았다.

​

​

3. 124 나라의 숫자

1 : 3 * 0 + 1 : 1
2 : 3 * 0 + 2 : 2
3 : 3 * 0 + 3 : 4
4 : 3 * 1 + 1 : 11
5 : 3 * 1 + 2 : 12
6 : 3 * 1 + 3 : 14
7 : 3 * 2 + 1 : 21
8 : 3 * 2 + 2 : 22
9 : 3 * 2 + 3 : 24
10 : 3 * 3 + 1 : 41
11 : 3 * 3 + 2 : 42
12 : 3 * 3 + 3 : 44
13 : 3*3*1 + 3*1 + 1 : 111

조금 복잡하다. 그러나, 결국 진법변환 tool은 아래와 같이 동일하다.

while(n){
    n%3; // 해당 자리수
    n/=3; // 나눠줌
}

이게 기본이로 두고 생각해 보자. 124 나라의 진법의 경우에는 1의 자리수에 1, 2, 4가 온다. 그러나 사실 4를 3으로 바꿔 생각하면 좀 쉬워진다.

0, 1, 2 대신 1, 2, 3이 오는 것이다. 따라서 n%3 대신 (n-1)%3 + 1을 해 준다. 그러면 나머지 부분은 해결이다. 몫 쪽을 보자. 만약 r(나머지)이 3이 되는 경우에는 3진법인데 +3이 되는 것이므로, 몫이 하나 작아져야 한다. 따라서 n/=3 이후 n--를 해 주는 것이다. 그리고 r이 3인 경우에는 4로 바꿔준다.

// 124 나라의 숫자

#include <string>
#include <vector>

using namespace std;

string solution(int n) {
    string answer = "";
    int r;
    while(n){
        r = ((n-1) % 3) + 1;
        n /= 3;
        if(r==3){
            r = 4;
            n--;
        }
        answer = to_string(r) + answer;
    }
    return answer;
}

 

4. 짝지어 제거하기

기본적인 stack 문제다.

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

22.04.06. 풀었던 문제들  (0) 2022.06.22
22.04.05. 풀었던 문제들  (0) 2022.06.22
22.04.02. 풀었던 문제들  (0) 2022.06.22
22.04.01. 풀었던 문제들  (0) 2022.06.22
22.03.31. 풀었던 문제들  (0) 2022.06.22
    hyelie
    hyelie

    티스토리툴바