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

1. 나머지가 1이 되는 수 찾기

기초 반복문 문제였다.

​

​

2. 두 개 뽑아서 더하기

중복을 허락하지 않고, 정렬되어 있는 set 자료구조의 특징을 이용하면 쉽게 풀 수 있다.

​

​

3. 3진법 뒤집기

string 기본 문제였다.

​

​

4. 내적

loop 기본 문제였다.

​

​

5. 약수의 개수와 덧셈

simple for문이 아니라 조금 더 시간복잡도를 줄여보자.

​

​

6. 음양 더하기

기본 loop문이었다.

​

​

7. 없는 숫자 더하기

set으로 풀었지만... 그냥 총 합에서 빼는 방법도 있다.

​

​

8. 폰켓못

set으로 풀었다. set에 vector들의 원소를 넣고 싶을 때는 for문을 사용해서 하나하나 삽입해 주어도 되지만 초기화 하는 방법이 있으니 이를 참고하자.

​

​

9. 소수 만들기

소수 판정 및 3중 for문 사용하면 된다.

​

​

10. 예산

처음엔 two-pointer라고 생각했는데, 그게 아니라 단순한 수학적 증명이었다.

 
 
정렬해서 앞에서부터 따오는 게 optimal인가?

(오름차순 정렬된) a1, a2, ... an, 그리고 b가 있다고 하자.
ai + ... + aj <= b인 i, j가 문제 조건을 만족시키는 optimal value이라고 하자. (i != 1, i < j)
a_i-1 <= a_i <= a_j이기 때문에
a_i-1 + a_i+1 + ... + aj <= ai + ... + aj
또, a_i-1 + a_i + ... + a_j-1 <= a_i-1 + a_i+1 + ... + aj <= ai + ... + aj이 된다.

이렇게 계속 반복해 나가면 어떤 j-i+1인 k에 대해
a1 + ... + ak <= ai + ... + aj가 되는데
그리고 제한조건에서 i != 1이라고 명시했기 때문에
a1 + ... + ak < ai + ... + aj는 자명하다.
이때 ai + ... + aj - (a1 + ... + ak)의 차를 이용해 a_k+1를 넣을 수도 있고(아닐 수도 있다)
넣는 경우 i != 1인 i, j 쌍은 존재하지 않고, 아닌 경우에는 i-j+1 = k는 또다른 optimal...
따라서 앞에서부터 세는 게 optimal이다.

​

11. 로또의 최고 순위와 최저 순위

간단한 구현 문제였다.

​

​

​

​

12. [1차] 다트 게임

(항상 귀찮은 문자열이 들어간)구현 문제다.

​

​

13. [1차] 비밀 지도

12번과 마찬가지로 구현 문제다. 이건 좀 인상깊다. 나중에 한 번 다시 풀어보자.

​

​

이제 5일차인가? lv 1 카카오 문제 8개만 풀면 lv1은 다 끝낸다. 감 천천히 잡아가고 있다. 힘내자.

​

​

14. 실패율

이 소스코드가 계속 seg fault 뜬다. while(idx<length && stages[idx] == i) 여기서 seg fault가 뜨는데... idx는 항상 0보다 크고, length보다 작다는 게 보장되는데 대체 왜 에러가 나는지 모르겠다...

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

using namespace std;

typedef pair<int, double> pid;

bool comp(pair<int, double>& a, pair<int, double>& b){
    if(a.second > b.second) return true;
    else{
        return a.first < b.first;
    }
}

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

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

22.03.28. 풀었던 문제들  (0) 2022.06.22
22.03.27. 풀었던 문제들 *** 정규표현식 정리하기  (0) 2022.06.22
22.03.25. 풀었던 문제들  (0) 2022.06.22
22.03.24. 풀었던 문제들  (0) 2022.06.22
22.03.23. 풀었던 문제들  (0) 2022.06.22
    hyelie
    hyelie

    티스토리툴바