이번주는 자율 프로젝트 진행 및 cs 학습을 하였다.

 

알고리즘

1일 1알고리즘 실천

 

자율 프로젝트 진행

Unity 개발 막바지이다.

지금까지 개발한 것에 대해 피드백을 받았고, 수정을 진행 중이다.

역할분담 한것들 합쳐서 테스트를 해봤는데 생각보다 괜찮은것 같다.

근데 VR 너무 어지럽다 ㅋㅋㅋ

다음주에 마무리 잘 할수 있도록 해야겠다.

 

CS 학습

면접이 코앞이라 부족한 cs들을 학습하고 있다.

운영체제, 데이터베이스, 자료구조, 알고리즘 등 개념들을 정리하고 이해하기 위한 노력을 했다.

 

후기

벌써 다음주가 프로젝트 마지막 주고, 사실상 싸피 교육과정도 다 끝난것 같다.

이제 본격적인 취업준비를 해야하는데 정말 막막하다.

코테는 자신있지만 면접 경험을 많이 쌓아야되겠다는 생각이 든다.

'잡담' 카테고리의 다른 글

11월 4주차 결산  (0) 2021.11.28
11월 3주차 결산  (0) 2021.11.21
11월 1주차 결산  (0) 2021.11.07
10월 4주차 결산  (0) 2021.10.31
10월 3주차 결산  (0) 2021.10.24

이번주는 자율 프로젝트를 진행하였다.

 

알고리즘

1일 1알고리즘 실천

 

자율 프로젝트 진행

Unity로 VR 개발을 진행중이다.

모르는 것이 많다보니 팀원들과 정보 공유를 하거나 구글링을 많이 하고있다.

 

후기

사실상 개발이 1주밖에 남지 않았다.

웹의 분량이 거의 없고, 대부분이 제로 베이스로 시작한 Unity라서 속도가 조금 더딘 부분이 있는것 같다.

최근 스스로가 나태해진 느낌이 다시 들고있어서 정신 바짝 차리고 해야겠다는 생각이 들었다.

그리고 네이버 면접 일정이 나왔는데 프로젝트와 일정이 겹친 부분이 있어서 시간 분배를 잘 해야 할 것 같다.

cs가 답이 없는데 어떡하지? ㅠ

'잡담' 카테고리의 다른 글

11월 3주차 결산  (0) 2021.11.21
11월 2주차 결산  (0) 2021.11.14
10월 4주차 결산  (0) 2021.10.31
10월 3주차 결산  (0) 2021.10.24
10월 2주차 결산  (0) 2021.10.17

이번주는 자율 프로젝트 진행을 하였다.

 

알고리즘

1일 1알고리즘 실천

할로윈이라 그런지 잔디 색이 바꼈다 신기..

 

자율 프로젝트 진행

프로젝트 진행을 위해 역할 분담을 하고, 개발을 시작하였다.

오큘러스를 받기 전이었어서 vr이 없는 상태로 여러 기능을 테스트했다.

 

후기

오큘러스를 2대를 신청했는데 1대만 받았다..

이게 싸피측에서 전달이 안된건지 안한건지 어떻게 돌아가는건지 모르겠다.

사실상 개발이 2주밖에 남지 않았는데 할 수 있을지 걱정이 들기도 한다.

지난번에 네이버 코테를 봤었고, 합격 통보를 받았다.

코테는 자신있었기에 면접 볼 줄은 알았지만 면접 기간이 프로젝트 기간과 겹쳐서 더 바쁘게 살아야 할 것 같다.

'잡담' 카테고리의 다른 글

11월 2주차 결산  (0) 2021.11.14
11월 1주차 결산  (0) 2021.11.07
10월 3주차 결산  (0) 2021.10.24
10월 2주차 결산  (0) 2021.10.17
10월 1주차 결산  (0) 2021.10.10

[이전글]에서 카메라의 Culling Mask에 대해 소개하였습니다.

이 글에서는 script로 Culling Mask를 특정 상황에서 변경하는 것을 다룰 것입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
// CullingMask를 Everything으로 변경합니다.
Camera.main.cullingMask = -1;
// CullingMask를 Nothing으로 변경합니다.
Camera.main.cullingMask = 0;
// CullingMask에 "Group" Layer를 추가합니다.
Camera.main.cullingMask |= 1 << LayerMask.NameToLayer("Group");
// CullingMask에 "Group" Layer를 제거합니다.
Camera.main.cullingMask = Camera.main.cullingMask & ~(1 << LayerMask.NameToLayer("Group"));
// Nothing 상태인 CullingMask에서 Group Layer를 추가합니다.
Camera.main.cullingMask = 1 << LayerMask.NameToLayer("Group");
// Everything 상태인 CullingMask에서 Group Layer를 제거합니다.
Camera.main.cullingMask = ~(1 << LayerMask.NameToLayer("Group"));
cs

script에서 Culling Mask를 다루는 명렁어는 대략 이정도 있으며, 이를 활용하여 script를 구현합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ChangeCullingMask : MonoBehaviour
{
    void changeCullingMask(int idx)
    {
        if (idx == 0)
        {
            // CullingMask를 Everything으로 변경합니다.
            Camera.main.cullingMask = -1;
        }
        else if (idx == 1)
        {
            // CullingMask에 Group2를 추가하고 Group1을 제거합니다.
            Camera.main.cullingMask |= 1 << LayerMask.NameToLayer("Group2");
            Camera.main.cullingMask = ~(1 << LayerMask.NameToLayer("Group1"));
        }
        else
        {
            // CullingMask에 Group1을 추가하고 Group2를 제거합니다.
            Camera.main.cullingMask |= 1 << LayerMask.NameToLayer("Group1");
            Camera.main.cullingMask = ~(1 << LayerMask.NameToLayer("Group2"));
        }
    }
}
cs

위 코드는 ChangeCullingMask라는 이름의 script이며, 버튼이 눌러질 때마다 인덱스(idx)와 함께 호출될 메소드를 정의하였습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ButtonClick : MonoBehaviour
{
    public ChangeCullingMask changeCullingMask;
    public int idx;
    private void OnMouseDown()
    {
        changeCullingMask.Change(idx);
    }
}
cs

그 다음은 ButtonClick이라는 이름의 script입니다.

마우스 클릭 이벤트로 호출되는 OnMouseDown 메소드를 사용하였습니다.

이제 버튼을 클릭할 때마다 이 메소드가 호출됩니다.

 

이제 작성한 script들을 object에 적용시키는 일만 남았습니다.

우선 메인 카메라 밑에 버튼으로 사용하기 위해 Cube 3개를 생성합니다.

 

그리고 ChangeCullingMask.cs를 MainCamera에 적용시킵니다.

 

그리고 생성해놓은 Cube들에 ButtonClick.cs를 적용시킨 후에

ChangeCullingMask에 MainCamera를 넣고, 인덱스(idx)를 0 1 2로 각각 지정해줍니다.

 

 

이제 실행해봅니다.

먼저 첫번째 Cube를 클릭한 모습입니다.

idx = 0이며, CullingMask를 Everything으로 변경하여 모든 Object를 볼 수 있습니다.

 

두번째 Cube를 클릭한 모습입니다.

idx = 1이며, "Group1" Layer를 지정한 파란색 Cube들이 카메라에 보이지 않습니다.

 

세번째 Cube를 클릭한 모습입니다.

idx = 2이며, "Group1" Layer를 지정한 파란색 Cube들이 다시 카메라에 보이고 "Group2" Layer를 지정한 빨간색 Cube들이 카메라에 보이지 않습니다.

 

이런식으로 여러 상황에서 CullingMask를 변경하여 카메라에 특정 Object만 보이게 설정할 수 있습니다.

'Etc' 카테고리의 다른 글

GitHub Actions를 이용한 Slack Notification  (0) 2023.01.30
GitLab -> GitHub Mirroring  (0) 2022.06.12
Unity 카메라 Culling Mask  (0) 2021.10.29
TypeScript 실행  (0) 2021.08.30
TypeScript 설치  (0) 2021.08.30

Unity의 Culling Mask란 원하는 Layer를 가진 Object들만 카메라로 볼 수 있게 하는 기능입니다.

image

우선 여러개의 Cube를 생성하여 그룹을 나눕니다. (Group1, Group2)

구별을 위해 Group1에는 파란색, Group2에는 빨간색 Material을 넣었습니다.

 

그리고 그룹 간 구분을 위해 Layer -> Add Layer에서 Layer를 두개 만들어줍니다.
저는 "Group1"과 "Group2"를 생성하였습니다.

imageimage

 

그 다음 Group1에 "Group1" 이라는 Layer를, Group2에 "Group2" 라는 Layer를 추가해 넣어줍니다.

imageimage

이제 Culling Mask 사용을 위한 준비가 끝났습니다.

 

Main Camera의 Inspector -> Camera Component에 Culling Mask가 있습니다.
현재 Everything이 default로 지정이 되어있으며, 모든 Object를 카메라로 보여주고 있습니다.

image

그리고 현재 메인 카메라에 보이는 모습입니다.

 

이제 Culling Mask에서 Group1을 지우겠습니다.

Group1을 체크 해제하는 순간 Culling Mask는 Everything -> Mixed가 되는 것을 볼 수 있으며

Scene 창에서는 Group1이 보이지만 메인 카메라 화면에는 보이지 않는 것을 확인할 수 있습니다.

 

다만 카메라에는 안보이지만 실제로 존재하는 Object이므로 충돌 판정은 있습니다.

Collider를 없애서 그냥 통과하게 만들거나 하는 응용도 가능해보입니다.

'Etc' 카테고리의 다른 글

GitLab -> GitHub Mirroring  (0) 2022.06.12
Unity Script로 카메라 Culling Mask 기능 사용하기  (2) 2021.10.29
TypeScript 실행  (0) 2021.08.30
TypeScript 설치  (0) 2021.08.30
Windows 10 에서 WSL을 이용한 우분투 설치  (0) 2021.08.29

이번주는 자율 프로젝트 기획과 사전 학습을 하였다.

 

알고리즘

1일 1알고리즘 실천

이번주는 투 포인터 위주로 풀었다.

 

자율 프로젝트 기획

팀원들과 시나리오 회의를 하였다.

좋은 아이디어를 떠올리기 힘들었지만 어느정도 방향은 잡힌 상태라 다행이라고 생각한다.

이제 더 구체적으로 생각해나갈 차례이다.

 

Unity 학습

이번주에 Unity 특강도 들으면서 배운것 복습과 C# 스크립트 분석을 하였다.

Unity와 C#을 처음 접하다보니 어떤 동작을 위해 어떤 코드를 작성해야 하는지 감이 오지 않았지만 서서히 극복해야 할 문제이다.

 

후기

벌써 프로젝트를 완성해야할 기간이 사실상 3주밖에 남지 않았다.

마지막 주차에는 발표준비와 UCC 제작을 해야하니 그 전주에 개발을 완료해야한다.

시간이 너무 빨리간다는 것을 새삼 느낀다.

무사히 마무리 했으면 좋겠다.

'잡담' 카테고리의 다른 글

11월 1주차 결산  (0) 2021.11.07
10월 4주차 결산  (0) 2021.10.31
10월 2주차 결산  (0) 2021.10.17
10월 1주차 결산  (0) 2021.10.10
9월 5주차 결산  (0) 2021.10.03

https://www.acmicpc.net/problem/1253

 

1253번: 좋다

첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)

www.acmicpc.net

투 포인터를 이용하여 배열 내의 어떤 수를 다른 두개의 합으로 나타낼 수 있는지 확인합니다.

투 포인터 사용을 위해 배열을 오름차순으로 정렬하고, 0번 인덱스부터 N - 1번 인덱스까지 전부 확인합니다.

초기 값은 left = 0, right = N - 1이며, 합이 list[i]와 같으면 바로 break, 합이 더 크면 right를 1 감소, 합이 더 작으면 left를 1 증가시킵니다.

 

이 문제에서 주의할 점은 "수의 위치가 다르면 값이 같아도 다른 수이다" 부분입니다.

자기 자신과 0을 더하는 경우가 나올 수 있는 left 또는 right가 i와 일치한 경우만 제외하였습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <algorithm>
#define MAX 2000
using namespace std;
 
int list[MAX];
int N;
 
void func() {
    int ans = 0;
    for (int i = 0; i < N; i++) {
        int l = 0;
        int r = N - 1;
        while (l < r) {
            if (l == i) {
                l++;
                continue;
            }
            if (r == i) {
                r--;
                continue;
            }
 
            int sum = list[l] + list[r];
            if (sum == list[i]) {
                ans++;
                break;
            }
            else if (sum > list[i]) {
                r--;
            }
            else {
                l++;
            }
        }
    }
 
    cout << ans << '\n';
}
 
void input() {
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> list[i];
    }
    sort(list, list + N);
}
 
int main() {
    cin.tie(NULL); cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    input();
    func();
 
    return 0;
}
cs

'algorithm > Two-Pointer' 카테고리의 다른 글

boj 9024 두 수의 합  (0) 2021.10.21
boj 17609 회문  (0) 2021.03.29
boj 2559 수열  (0) 2021.02.12
boj 1806 부분합  (0) 2021.01.22
boj 2003 수들의 합 2  (0) 2021.01.22

https://www.acmicpc.net/problem/9024

 

9024번: 두 수의 합

프로그램은 표준입력으로 입력을 받는다. 프로그램 입력은 t 개의 테스트 케이스로 구성된다. 입력의 첫 번째 줄에 테스트 케이스의 개수를 나타내는 정수 t 가 주어진다. 두 번째 줄부터 두 줄

www.acmicpc.net

배열에서 합이 K에 가장 가까운 서로 다른 두 개의 정수 조합의 갯수를 구하는 문제입니다.

이 문제는 투 포인터를 이용하여 해결할 수 있습니다.

 

투 포인터 사용을 위해 배열을 오름차순으로 정렬합니다.

그리고 left = 0, right = N - 1에서 시작합니다.

 

두 정수의 합(list[l] + list[r])이 K에 더 가까우면 합(ans)을 갱신, 갯수를 의미하는 cnt를 1로 초기화합니다.

만약 두 정수의 합과 갱신된 합이 같으면 cnt를 1 증가합니다.

그리고 두 정수의 합이 K보다 크면 값을 작게 해야하므로 right를 1 감소,

두 정수의 합이 K보다 작으면 값을 크게 해야하므로 left를 1 증가시킵니다.

 

최종으로 K에 가장 가까운 두 정수의 조합의 갯수인 cnt를 출력합니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <algorithm>
#define MAX 1000000
using namespace std;
 
int list[MAX];
int N, K;
 
void func() {
    int l = 0;
    int r = N - 1;
    int ans = 2e8;
    int cnt = 0;
    while (l < r) {
        int sum = list[l] + list[r];
        if (abs(sum - K) < abs(ans - K)) {
            ans = sum;
            cnt = 1;
        }
        else if (abs(sum - K) == abs(ans - K)) {
            cnt++;
        }
 
        if (sum > K) r--;
        else l++;
    }
 
    cout << cnt << '\n';
}
 
void input() {
    cin >> N >> K;
    for (int i = 0; i < N; i++) {
        cin >> list[i];
    }
    sort(list, list + N);
}
 
int main() {
    cin.tie(NULL); cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    int tc;
    cin >> tc;
    while (tc--) {
        input();
        func();
    }
 
    return 0;
}
cs

'algorithm > Two-Pointer' 카테고리의 다른 글

boj 1253 좋다  (0) 2021.10.21
boj 17609 회문  (0) 2021.03.29
boj 2559 수열  (0) 2021.02.12
boj 1806 부분합  (0) 2021.01.22
boj 2003 수들의 합 2  (0) 2021.01.22

이번주는 자율 프로젝트 기획과 사전 학습을 하였다.

 

알고리즘

1일 1알고리즘 실천

이번주도 그리디 위주로 풀었다.

 

그리고.. 백준 1000문제를 달성하였다.

 

자율 프로젝트 기획

프로젝트 시작 단계여서 아이디어 회의부터 진행하였고, 계획서를 작성해서 제출하였다.

다음주부터 본격적인 기획에 들어가지 않을까싶다.

 

Unity 학습

Unity에 익숙해지기 위해 특강 시간에 배운 것을 복습해보고 튜토리얼도 체험중이다.

이번 프로젝트에서 처음 해보는 Unity를 다루어야 하기때문에 여기에 많은 시간을 투자 해야할 것 같다.

 

후기

알고리즘 시작한 지 2년 5개월정도 됐는데 늦게나마 1000문제를 채우고나니 감회가 좀 새로운것 같다.

처음 알고리즘 시작했던 때가 생각나기도 하고.. 그렇다.

알고리즘 푸는게 재밌어서 하는것도 있고, 앞으로도 감을 잃지 않을 정도의 투자는 하려고한다.

드디어 마지막 프로젝트를 시작했다.

저번 프로젝트때 사전학습이 부족해서 진행하는데 어려움을 겪었던 경험을 토대로 이번 프로젝트는 기본기부터 탄탄하게 갖추고 시작해야겠다는 생각이 들었다.

그리고 시간 정말.. 빠르다.

'잡담' 카테고리의 다른 글

10월 4주차 결산  (0) 2021.10.31
10월 3주차 결산  (0) 2021.10.24
10월 1주차 결산  (0) 2021.10.10
9월 5주차 결산  (0) 2021.10.03
9월 4주차 결산  (0) 2021.09.26

https://www.acmicpc.net/problem/16120

 

16120번: PPAP

첫 번째 줄에 문자열이 주어진다. 문자열은 대문자 알파벳 P와 A로만 이루어져 있으며, 문자열의 길이는 1 이상 1,000,000 이하이다.

www.acmicpc.net

P는 PPAP 문자열이며, P를 PPAP로 바꾼 문자열 역시 PPAP 문자열입니다.

이 조건과 문자열 주어졌을 때 PPAP 문자열인지 판별하는 문제입니다.

 

우선 문자열의 처음부터 순회를 합니다.

해당 위치의 문자가

'P'이면 cnt를 1 증가합니다.

'A'이면 cnt가 2 이상이고, 다음 문자가 'P'이면 PPAP문자열이므로 PPAP를 P로 변경합니다.

실제 로직으로는 cnt를 1 감소하고, 다음 인덱스가 P인것을 확인했으니 인덱스도 1 증가합니다.

만약 'A'일때 cnt가 2보다 작거나, 마지막 인덱스이거나, 다음 문자가 'P'가 아니면 NP를 출력합니다.

 

순회가 끝났을때 남는 문자열은 P여야하므로 cnt가 1일때만 PPAP를 출력, 아니면 NP를 출력합니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <string>
using namespace std;
 
string str;
int N;
 
void func() {
    int cnt = 0;
    for (int i = 0; i < N; i++) {
        if (str[i] == 'P') cnt++;
        else {
            if (cnt >= 2 && i < N - 1 && str[i + 1== 'P') {
                cnt--;
                i++;
            }
            else {
                cout << "NP\n";
                return;
            }
        }
    }
 
    if (cnt == 1cout << "PPAP\n";
    else cout << "NP\n";
}
 
void input() {
    cin >> str;
    N = str.size();
}
 
int main() {
    cin.tie(NULL); cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    input();
    func();
 
    return 0;
}
cs

'algorithm > Greedy' 카테고리의 다른 글

boj 1263 시간 관리  (0) 2024.07.03
boj 18185 라면 사기 (Small)  (0) 2024.07.02
boj 2262 토너먼트 만들기  (0) 2021.10.16
boj 13904 과제  (0) 2021.09.30
boj 1826 연료 채우기  (0) 2021.02.22

https://www.acmicpc.net/problem/2262

 

2262번: 토너먼트 만들기

월드시에서는 매년 n명의 사람들이 모여 월드 크래프트라는 게임의 토너먼트 대회를 치른다. 이 게임은 특성상 실력만이 승패를 좌우하기 때문에, 아무리 실력이 엇비슷한 사람이 시합을 치러

www.acmicpc.net

주어지는 랭킹은 중복이 없으며, 랭킹이 높은 사람 (숫자가 낮은 사람)이 무조건 이깁니다.

문제에서 요구하는 것은 이 토너먼트에서 각 경기에 임하는 선수들의 랭킹의 차이의 합이 최소가 되도록 대진을 구성해야합니다.

 

랭킹이 낮을수록 (숫자가 클수록) 랭킹의 차이의 합이 커지므로 랭킹이 낮은 선수는 빠르게 경기를 하는 것이 이득입니다.

따라서 랭킹이 낮은 선수부터 차례대로 본인의 좌우 선수들 중 랭킹이 낮은 선수와 경기를 하게 만들면 랭킹의 차이의 합이 최소가 됩니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <algorithm>
#define MAX 256
using namespace std;
 
int list[MAX];
int N;
 
void func() {
    int ans = 0;
    for (int i = N; i > 1; i--) {
        int j = 0;
        for (; j <= N; j++) {
            if (i == list[j]) break;
        }
 
        ans += (i - max(list[j - 1], list[j + 1]));
 
        for (; j < N; j++) {
            list[j] = list[j + 1];
        }
        N--;
    }
 
    cout << ans << '\n';
}
 
void input() {
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> list[i];
    }
}
 
int main() {
    cin.tie(NULL); cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    input();
    func();
 
    return 0;
}
cs

'algorithm > Greedy' 카테고리의 다른 글

boj 18185 라면 사기 (Small)  (0) 2024.07.02
boj 16120 PPAP  (0) 2021.10.16
boj 13904 과제  (0) 2021.09.30
boj 1826 연료 채우기  (0) 2021.02.22
boj 8980 택배  (0) 2021.02.16

이번주는 SSDC 프로젝트 마무리를 하였다.

 

알고리즘

1일 1알고리즘 실천

그리디를 못해서 차례대로 풀어보고있다.

 

소스콘 프로젝트 마무리

프로젝트 진행 중 바뀐 정식 명칭은 SSDC다.

이번주에 발표까지 마무리가 되었고, 3팀 중 2등을 하였다.

 

네이버 코테

인생 처음 네이버 코테를 보았는데 생각보다 괜찮았던것 같다.

일단 4문제 다 풀기는 했는데 결과가 나와야 안심할 수 있을것 같고, 일단은 CS공부를 해야겠다.

 

후기

이번주로 소스콘 프로젝트가 마무리되었다.

제로베이스로 시작한 프로젝트라 걱정이 많았지만 만족한 결과를 얻어서 다행이다.

우리 팀원분들 너무 고생하셨습니다!ㅠ

이제 다음주부터 싸피 교육과정에서의 마지막 프로젝트를 하는데 열심히 해서 좋은 경험을 쌓아야겠다는 생각이 들었다.

'잡담' 카테고리의 다른 글

10월 3주차 결산  (0) 2021.10.24
10월 2주차 결산  (0) 2021.10.17
9월 5주차 결산  (0) 2021.10.03
9월 4주차 결산  (0) 2021.09.26
9월 3주차 결산  (0) 2021.09.19

+ Recent posts