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.03.27. 풀었던 문제들 *** 정규표현식 정리하기

1. 크레인 인형뽑기 게임

문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자 문제를 잘 읽자

​

​

2. 키패드 누르기

간단한 구현 문제였다.

​

​

3. 숫자 문자열과 영단어

string 문제였다. 침착하게 잘 풀어보자. 특히 string parsing을 할 때 index가 잘 저장되는지 기억하자.

그리고 정규표현식으로 이 문제를 쉽게 풀 수 있다. 정규표현식도 정리해 보자.

​

​

4. 신규 아이디 추천

시키는 대로 잘 풀면 되는 문제다. 마찬가지로 문자열..이 귀찮다.

​

​

5. 신고 결과 받기

map을 이용해 풀 수 있는 구현 문제였다.

​

​

6. 실패율

seg fault의 이유를 정말정말 모르겠다.... 내 풀이는 맞는 것 같고 이유가 없는데...

*알았다. c++에서 sort 함수를 weak하게 설정할 경우 간혹 seg fault가 난다고 합니다. 진짜 충격적입니다... 정렬함수를 아래와 같이 바꾸니까 정상작동 한다.... 진짜 seg fault가 stages[cur_idx]에서밖에 나오지 않을 거라 생각해 몇일을 붙들고 있었는데.. 허망하다.... 이건 진짜 "맞왜틀"이다.

​

<풀이>

stages를 오름차순으로 sort 한 후 2개의 idx를 둔다.

- cur_idx는 현재 stage까지 도달한 사람의 idx,

- pre_idx는 이전 stage까지 도달한 사람의 idx이다.

​

for문으로 stage 1부터 N까지 돌린다.

stage i에 도달한 사람은 전체 length - cur_idx이다.

이어서 해당 stages를 돌파한 사람의 idx까지 cur_idx를 전진시킨다.(이게 while문이며, stages[cur_idx] <= stage면 cur_idx ++를 하는 이유다.)

while문을 빠져나오면 cur_idx는 현 stage를 돌파한 사람의 idx까지 전진되어 있고, pre_idx는 현 stage를 돌파하지 못한 사람들의 idx에 있다. 따라서 cur_idx - pre_idx를 하면 unclear한 사람들의 size이다.

만약 reached가 0이면 0으로 나눠지므로 예외처리를 한 후 v에 넣는다.

​

vector v를 내 입맛대로 sort한 후 print하면 된다.

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

using namespace std;

typedef pair<int, double> pid;

// .first : 층수, .second : 실패율
bool comp(pair<int, double>& a, pair<int, double>& b){
    if(a.second > b.second) return true;
    else if(a.second == b.second){
        return a.first < b.first;
    } else{
        return false;
    }
}

vector<int> solution(int N, vector<int> stages) {
    sort(stages.begin(), stages.end());
    vector<pid> v;
    // pre_idx : 이전 stage까지 도달한 사람의 idx
    // cur_idx : 현재 stage까지 도달한 idx
    int length = stages.size(), pre_idx = 0, cur_idx = 0;
    int reached = 0, unclear = 0;
    double rate;
    
    for(int stage = 1; stage <= N; stage++){
        reached = length - cur_idx;
        while(cur_idx < length && stages[cur_idx] <= stage) cur_idx++;
        unclear = cur_idx - pre_idx;
        pre_idx = cur_idx;
        rate = (reached==0) ? 0 : (double)unclear / (double)reached;
        
        v.push_back({stage, rate});
    }
    
    sort(v.begin(), v.end(), comp);

    vector<int> answer(N);
    for(int i = 0;i <N; i++){
        answer[i] = v[i].first;
    }
    return answer;
}

/*

오름차순 정렬 시
1 2 2 2 3 3 4 6
이전 stage까지 간 사람들 : pre_idx (= 0)라고 하자.
1번 스테이지
    도달한 플레이어 수 : 전체 length - idx = 8명 도달
    클리어하지 못한 플레이어 수 : 1이 아닐때까지 idx 전진 -> idx 1에서 정지
    idx 1 - pre_idx 0 = 1
    실패욜 1/8
    pre_idx = idx = 1
2번 스테이지
    도달한 플레이어 수 : 전체 length - idx(1) = 7명 도달
    클리어하지 못한 플레이어 수 : 2가 아닐 때까지 idx 전진 -> idx 4에서 정지
    idx 4 - pre_idx 1 = 3
    실패율 3/7
    pre_idx = idx = 4
3번 스테이지
    도달한 플레이어 수 : 전체 length - idx(4) = 4명 도달
    클리어하지 못한 플레이어 수 : 3이 아닐 떄까지 idx 전진 : idx 6에서 정지
    idx 6 - pre_idx 4 = 2
    실패율 2/4
    pre_idx = idx = 6
4번 스테이지
    도달한 플레이어 수 : 전체 length - idx(6) = 2명 도달
    클리어하지 못한 플레이어 수 : 4이 아닐 떄까지 idx 전진 : idx 7에서 정지
    idx 7 - pre_idx 6 = 1
    실패율 1/2
    pre_idx = idx = 7
5번 스테이지
    도달한 플레이어 수 : 전체 length - idx(7) = 1명 도달
    클리어하지 못한 플레이어 수 : 5가 아닐 때까지 idx 전진 : idx 7에서 정지
    idx 7 - pre_idx 7 = 0
    실패율 0/1

stage 개수 5개임.
1 2 2 2 3 3 4 4
1번 스테이지
    도달한 플레이어 수 : 전체 length - idx = 8명 도달
    클리어하지 못한 플레이어 수 : 1이 아닐때까지 idx 전진 -> idx 1에서 정지
    idx 1 - pre_idx 0 = 1
    실패욜 1/8
    pre_idx = idx = 1
2번 스테이지
    도달한 플레이어 수 : 전체 length - idx(1) = 7명 도달
    클리어하지 못한 플레이어 수 : 2가 아닐 때까지 idx 전진 -> idx 4에서 정지
    idx 4 - pre_idx 1 = 3
    실패율 3/7
    pre_idx = idx = 4
3번 스테이지
    도달한 플레이어 수 : 전체 length - idx(4) = 4명 도달
    클리어하지 못한 플레이어 수 : 3이 아닐 떄까지 idx 전진 : idx 6에서 정지
    idx 6 - pre_idx 4 = 2
    실패율 2/4
    pre_idx = idx = 6
4번 스테이지
    도달한 플레이어 수 : 전체 length - idx(6) = 2명 도달
    클리어하지 못한 플레이어 수 : 4이 아닐 떄까지 idx 전진 : idx 8에서 정지
    idx 8 - pre_idx 6 = 2
    실패율 2/2
    pre_idx = idx = 8
5번 스테이지
    도달한 플레이어 수 : 전체 length - idx(8) = 0명 도달
    -> 실패율 0으로 둠.
    
실패율 구한 다음에는 어떻게 할까....
"실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다."
스테이지-실패율 key-value로 vector 만들어서 정렬 ? 
pair<int, double>로 정렬하면 되겠다. 어차피 오름차순 이니까...


*/

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

22.03.29. 풀었던 문제들  (0) 2022.06.22
22.03.28. 풀었던 문제들  (0) 2022.06.22
22.03.26. 풀었던 문제들  (0) 2022.06.22
22.03.25. 풀었던 문제들  (0) 2022.06.22
22.03.24. 풀었던 문제들  (0) 2022.06.22
    hyelie
    hyelie

    티스토리툴바