넥스터즈 1 ~ 5주차

3월 중순 인수인계를 시작으로 약 3개월 간의 세션 준비를 마치고, 정규활동이 시작되었다.

CTO가 활동 기간에 할 일은 많지 않다.

현재 후원사인 네이버 클라우드의 크레딧 지원을 돕는 것, 컨퍼런스 강연자 초청 외에 큰 일은 없다.

 

정규활동 전까지 프로젝트 참여에 대한 고민을 했지만

이거 하면서 취준하면되지! 라는 생각으로, 이전 기수와 마찬가지로 새로운 기술을 사용해보는걸 목표로 참여하게 되었다.

23기 신입 면접 때 "이분과 같이 프로젝트 한다면 내가 많이 배울 수 있겠다" 싶은 분이 두 분 계셨는데 그중 한 분과 같은 팀이 되어 속으로 엄청 기뻐했다.

그것도 내가 1지망으로 원했던 팀으로 가게되어 더욱 기뻤던것 같다.

 

팀에 속해있지만 전체적인 세션 참여는 하지 않는 편이다.

운영진이라서 회원분들의 출석 관리 및 세션도중 발생하는 모든 상황을 대처하기 위해 뒤에 남아서 진행되는 세션을 참관했다고 하는게 맞을 것 같다.

그리고 팀 작업 시간에는 프로젝트에 참여하지 않는 운영진에게 일을 맡기고 나는 팀원들과 팀 작업을 한다.

 

지금까지는 성공적인 기수를 보내고 있다고 스스로 생각중이다.

8주라는 짧은 시간에 현실적으로 할 수 있는 것들이 무엇인지 고민했고, 적당한 크기의 프로젝트가 될 것 같아서 만족스럽다.

그리고 팀원들이 정말 열심히 한다.

하루종일 회의를 하거나 새벽까지 남아서 작업을 한다.

그만큼 프로젝트에 대한 열정이 있기에 좋은 결과물을 기대해 봐도 좋을것 같다는 생각이 든다.

5주차 세션까지 중간 발표가 있었고, 8월 중으로 최종 발표가 진행된다.

월 단위 회고 말고 23기 회고 글에 자세하게 작성할 예정이다.

 

취준 컴퍼니 7기

전 직장 상사의 추천으로 취준 컴퍼니의 존재를 알게 되어 지원하게 되었다.

활동은 매주 "로켓펀치를 이용한 지원서 제출 2회" 가 끝인데 집무실 무료 이용, 커피챗을 통한 취업상담 등 많은 혜택이 있다.

나는 한 달 동안 집무실을 무료로 이용할 수 있다는것이 너무 좋았다.

"서울대점" 기준으로 독서실처럼 본인만의 공간이 있었고 오픈되어있는 공간, 회의를 할 수 있는 부스 등 내부 시설도 깔끔하고 잘 되어있었다.

시간이나 의지가 생길때마다 출석하기 위한 노력을 하고 있고, 넥스터즈 프로젝트나 스터디 준비, 알고리즘 문제 풀이 등 여러가지 일을 하는 중이다.

 

RealMySQL 스터디

넥스터즈 22기가 끝나고 바로 시작했던 스터디다.

Java SpringBoot로 백엔드 개발을 진행 중이지만 DB 관련해서는 깊게 공부해본적이 없었기 때문에 시작하게 되었다.

처음 이 책을 접했을 때 "와 이건 너무 딥한데" 라는 생각이 먼저 들었다.

진짜 딥한건지 내가 몰라서 그런건지 판단을 못했지만 다른 스터디원분들도 딥하다고 말씀을 하신걸 보니 DBA 분들이 알만한 것들인가? 생각 하기도 했다.

처음에는 모든 것들을 다 정리하고 넘어가려고 했더니 진도를 따라가는데 힘들었지만

내가 당장 알아야되고, 사용해야되는 부분은 적었기에 가볍게 넘어가도 되겠다는 생각을 했다.

그래도 언젠가는 알아야될 개념은 맞기 때문에 핵심 위주의 학습을 진행할 것이다.

현재 RealMySQL 1권이 거의 마무리가 된 상태로, 다음달정도면 2권으로 넘어갈 예정이다.

2권 내용은 현재 내가 공부하기에 더 알맞다는 생각이 들어서 다른 마인드를 가지고 임할 예정이다.

 

Effective Java 스터디

넥스터즈 23기 면접때 알게되어 친해진 분과 내부 스터디를 개설하여 진행 중이다.

마침 스터디를 하나 늘리고 싶었고, 신뢰할 수 있는 분이기 때문에 같이 하게되었다.

지금까지 3회차까지 진행되었고, 스터디 진행 방식을 맞춰가는 중이다.

RealMySQL은 "내가 언젠가 사용할 수 있는 것들"이라면, Effective Java는 "당장 내가 사용하는 것들"이기 때문에 두 스터디에 대한 마음가짐이 다르다.

책을 읽어보니 내가 몰랐던 개념들이 생각보다 많았고, 이번 기회에 기본기를 최대한 다지기 위한 목표를 가지고 있다.

 

1일 1알고리즘

 

마무리

넥스터즈를 2기수동안 하면서 느낀점은 시간이 너무 빨리간다는 것이다.

특히 이번 기수는 운영진을 맡았기 때문에 22기 종료 직후에 바로 시작했는데 벌써 몇주 남지 않았다.

하반기 공채 시즌이 곧 다가올텐데 그냥 바쁘게 살자는 생각밖에 없다.

그래서인지 요즘 밤을 자주 새기도 하는데 건강은 잘 챙기도록 해야겠다.

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

2000  (4) 2023.09.13
8월 회고  (2) 2023.09.05
6월 회고  (2) 2023.07.02
5월 회고  (4) 2023.06.01
4월 4주차 결산  (2) 2023.05.01

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

 

12841번: 정보대 등산

숭실 대학교 정보 과학관은 숭실 대학교 건물 중 제일 높은 곳에 있다. 민주는 평소에 버스를 타고 이 언덕을 오르지만, 이 문제에 등장하기 위하여 오늘 하루만 걸어서 올라간다. 정보 과학관을

www.acmicpc.net

출발 지점은 왼쪽, 도착 지점은 오른쪽에 있으므로 무조건 횡단보도를 건너야 합니다. 

문제에서는 1번만 횡단보도를 건널 수 있다고 제한하고 있습니다.

그렇게 되면 계산은 간단해집니다.

왼쪽 길로 가다가 횡단보도를 건너고 나머지는 오른쪽 길로만 간다는 뜻이 됩니다.

 

여기서 누적 합을 떠올릴 수 있습니다.

왼쪽, 오른쪽 길의 누적합을 각각 구합니다.

아래 코드에서는 i + 1번 지점까지의 거리를 dp[i]로 저장하고 있습니다.

따라서 i번 지점에서 횡단보도를 건너려면 dp[i - 1] 까지만 계산하면 됩니다.

dp[i - 1].first + cross[i]: 왼쪽에서 i번 지점까지 이동 후 횡단보도를 건넜을 때의 길이가 됩니다.

 

횡단보도를 건넜으니 이제 오른쪽 길에 위치해 있습니다.

따라서 N번 지점까지 그냥 가기만 하면 됩니다. (+ dp[N - 1].second - dp[i - 1].second)

 

거리가 같으면 번호가 낮은 지점을 출력해야 한다는 점만 주의하셔서 최소를 갱신해주시면 됩니다.

 

 

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
#include <iostream>
#define MAX 100001
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
 
pii dp[MAX];
ll cross[MAX];
int N;
 
void func() {
    int idx = 0;
    ll ret = 1e12;
    for (int i = 1; i <= N; i++) {
        ll sum = cross[i] + dp[i - 1].first + dp[N - 1].second - dp[i - 1].second;
        if (ret > sum) {
            idx = i;
            ret = sum;
        }
    }
 
    cout << idx << ' ' << ret << '\n';
}
 
void input() {
    cin >> N;
    for (int i = 1; i <= N; i++) {
        cin >> cross[i];
    }
 
    for (int i = 1; i < N; i++) {
        cin >> dp[i].first;
        dp[i].first += dp[i - 1].first;
    }
 
    for (int i = 1; i < N; i++) {
        cin >> dp[i].second;
        dp[i].second += dp[i - 1].second;
    }
}
 
int main() {
    cin.tie(NULL); cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    input();
    func();
 
    return 0;
}
cs

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

boj 28018 시간이 겹칠까?  (0) 2023.08.08
boj 25427 DKSH를 찾아라  (0) 2023.05.21
boj 25682 체스판 다시 칠하기 2  (0) 2023.02.26
boj 12996 Acka  (0) 2023.01.29
boj 14450 Hoof, Paper, Scissors (Gold)  (0) 2022.12.30

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

 

15926번: 현욱은 괄호왕이야!!

첫 번째 입출력에서, 맨 처음 위치부터 4개를 잘라낸 (())가 가장 긴 올바른 괄호 문자열이다. 두 번째 입출력에서, 6번째 위치부터 8개를 잘라낸 ()((()))가 가장 긴 올바른 괄호 문자열이다.

www.acmicpc.net

주어진 입력에서 올바른 괄호쌍의 부분 문자열이 가장 긴 길이를 구하는 문제입니다.

올바른 괄호쌍을 구하기 위해서는 stack을 이용합니다.

 

기본 스택문제와 동일하게 `(`가 나오면 stack에 push, `)`가 나오면 stack에서 pop 연산을 수행합니다.

이 문제는 주어진 문자열의 인덱스를 이용합니다.

`(`가 나오면 그 인덱스를 stack에 push합니다.

`)`가 나오면 s.top의 인덱스와 현재 인덱스에 true 값을 넣습니다.

 

최종으로는 chk[i] = true인 부분의 max 길이를 구해주시면 되겠습니다.

 

 

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
#include <iostream>
#include <string>
#include <stack>
#include <algorithm>
#define MAX 200001
using namespace std;
 
string str;
bool chk[MAX];
int N;
 
void func() {
    stack<int> s;
    for (int i = 0; i < N; i++) {
        if (str[i] == '(') {
            s.push(i);
        }
        else {
            if (s.empty()) continue;
 
            chk[i] = chk[s.top()] = true;
            s.pop();
        }
    }
 
    int ret = 0;
    int conn = chk[0];
    for (int i = 1; i < N; i++) {
        if (chk[i]) conn++;
        else conn = 0;
 
        ret = max(ret, conn);
    }
 
    cout << ret << '\n';
}
 
void input() {
    cin >> N >> str;
}
 
int main() {
    cin.tie(NULL); cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    input();
    func();
 
    return 0;
}
cs

'algorithm > data-structure' 카테고리의 다른 글

boj 21939 문제 추천 시스템 Version 1  (0) 2022.02.11
boj 17299 오등큰수  (0) 2021.02.22
boj 9372 상근이의 여행  (0) 2021.02.09
boj 1158 요세푸스 문제  (0) 2021.02.09
boj 1918 후위 표기식  (0) 2021.02.05

Nexters 23기 신입 모집

6월 첫째주에 서류 합격자분들 대상으로 면접을 진행하였다.

22기 CEO를 맡으셨던 분께 기술면접 도움을 요청하였고, 나는 인성면접을 담당했다.

지원자분들의 서류를 보내드리자마자 달려들어서 꼼꼼히 봐주셔서 너무 감사했다.

면접도 잘 못보는 내가 면접관??? 이라는 생각이 가득했고, 걱정도 많이 됐었지만 옆에서 잘 도와주셔서 금방 적응할 수 있었다.

그래도 이렇게 실력있는 분들을 내가 면접보는게 맞나 싶긴 했다 ㅎㅎ 이건 동아리니까~

 

면접 당시 마이크 음질이 너무 안좋았다는걸 면접 내내 인지하지 못했다.

녹화본을 돌려볼 때 알게되어 충격을 받았고, 뿐만 아니라 스터디룸 내 네트워크 환경도 좋지 못해 면접이 지연되기도 했다.

면접자분들께 좋은 환경을 제공해드리지 못해서 너무 죄송하다.

 

수많은 면접자분들 중에서 합격자를 가려내기란 너무 어려웠다.

녹화본을 몇 번을 돌려봤는지 모르겠다.

최대한 꼼꼼하게 점수를 매겼고, 합격자 선발을 완료했다.

 

Nexters 23기 세션 준비

신입 기수 모집을 완료했으니 본격적으로 세션 준비에 들어간다.

대관 장소 답사를 해서 PC, 빔 프로젝트, 와이파이 등 환경들을 하나하나 점검했고, 필요한 것들을 정리했다.

 

다음은 아이디어 발제.

넥스터즈 프로젝트인 "모임모임"을 활용하여 아이디어 발제를 받았다.

참여를 많이 안하시면 어떡하지 걱정을 했지만 20건이 넘는 아이디어가 등록되어 만족스러웠다.

그 중 10개의 아이디어를 선정하였고, 선정된 아이디어로 이번 기수 프로젝트를 진행할 예정이다.

 

1주차 세션 준비.

7월 1일 첫 세션이 시작된다.

OT와 팀빌딩이 진행되는 중요한 세션이기 때문에 회의를 정말 많이한 것 같다.

후원사 소개, PM분들의 발표, 팀 빌딩, 직군별 네트워킹 등 고려해야할 것들이 많았고, 생각보다 시간이 너무 부족하다는 것을 깨달았다.

최대한 시간을 쪼개고 쪼개서 효율적으로 진행하기 위한 노력을 했다.

물론 이 글은 첫 세션을 마치고 쓰는 글이고, 관련 내용은 7월 회고에서 작성할 예정이다.

 

퇴사

6월 16일 퇴사를 하고, 백수의 삶을 즐기는 중이다.

넥스터즈를 백수로 참여할 줄은 몰랐지만 그만큼 더 의미있는 서비스를 개발할 수 있도록 노력할 것이다.

퇴사하는 주에 뜬금없이 코로나에 걸려서.. 바이러스를 뿌리고 가는 느낌이라 뭔가 찝찝하기도 했다.

한분 한분 인사 드리면서 떠나려고 했지만 코로나로 인해 인사도 제대로 못하고 퇴사해버렸다.

코로나 격리 의무도 없어서 마스크 쓰고 자리에 최대한 가만히 있었지만 눈치가 너무 보였다 ㅎㅎ

 

1일 1알고리즘

 

마무리

퇴사를 하니 뭔가 공허함이 느껴졌다.

평일 오전에 일어나서 출근하는게 당연했었는데 갑자기 안하게 되니 무슨 느낌인지 모르겠다.

스터디도 하면서 재취업 준비를 하는 중이고, 넥스터즈 프로젝트도 참여할 예정이다.

팀빌딩이 완료되었는데 원하는 주제로 프로젝트를 하게되었고, 좋은 팀원들을 만난 것 같아서 좋았다.

6월은 블로그를 쉬었는데, 이제 진짜 포스팅한다..

어쩌다보니 스터디2, 넥스터즈 CTO, 넥스터즈 프로젝트를 동시에 하게 될 것 같다. 화이팅!

 

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

8월 회고  (2) 2023.09.05
7월 회고  (0) 2023.08.04
5월 회고  (4) 2023.06.01
4월 4주차 결산  (2) 2023.05.01
4월 3주차 결산  (0) 2023.04.24

첫 월단위 회고, 5월에는 많은 일들이 있었다.

 

Nexters 23기 신입 모집

23기 운영진으로 활동 중이고, 5월에는 신입 회원 모집이 진행되는 일정이었다.

5.5 ~ 5.14 신입 서류 제출기간

5.24 신입 서류 결과

5.25 신입 면접 안내

현재 신입 회원 면접 준비기간이고, 이번 주말 면접 진행될 예정이다.

 

정말 많은분들이 지원을 해주셨고, 10일이라는 짧은 시간동안 검토를 해야해서 밤을 새면서까지 꼼꼼히 보려고 했다.

정말 실력있는 분들이 많이 지원해주셨는데 한정적인 티오로 인해 불합격을 드려야한다는게 안타까웠다.

특히 이번기수는 비수도권 인재분들 대상으로 교통비 전액 지원이라는 후원을 임팩트 캠퍼스를 통해 받게되어 학생/직장인 뿐만 아니라 수도권/비수도권도 고려를 해야하는 어려움이 있었다.

 

퇴사

나는 백엔드 개발자로 취업해서 들어왔지만 정신을 차려보니 5개월동안 프론트엔드 개발'만' 하고있었다.

초기에는 백엔드 개발자도 프론트엔드 개발 경험이 어느정도 도움될것이고, 병행을 해도 괜찮겠다는 생각을 했었다.

현실은 백엔드 비중은 없고, 프론트엔드 비중이 90%이상을 차지하고 있고, 앞으로 1년은 이렇게 유지될 것으로 생각하니 막막하기만 했다.

신입이라는 중요한 시기에 백엔드 경험을 쌓아야하는데 지금 이러고 있어도 되는지 생각을 정말 많이했다.

그 과정에서 번아웃이 너무 크게 찾아왔고, 어떤 일을 하든 부정적인 생각만 가득하게 되었다.

 

단순 백엔드 개발만 하더라도 내가 경험하지 못한것들, 배워야할 것들이 너무 많은데 지금 프론트엔드를 하는건 너무 이르다는 생각이 들었고, 백엔드에 집중해야겠다는 생각을 했다.

그렇게 나는 퇴사를 결심하게 되었고, 회사에 통보를 한 상태로 이번달 중에 퇴사할 예정이다.

 

1일 1커밋

2021년 7월 26일부터 667일간 진행된 1일 1커밋이 종료되었다.

매일 알고리즘을 풀고 깃허브에 push하는 과정을 반복했지만 이번에 끊겼다.

 

앞에서 언급한 번아웃이 가장 큰 원인이 아니었나 싶다.

내 스스로가 휴식을 윈했고, 주말, 연휴 할것없이 쉬기만 했다.

무언가를 회피하려고 하니 이런 기본적인 것들도 생각나지 않게되었고, 잔디에 구멍이 뚫려버렸다.

처음에는 아무 생각없이 커밋 시간 조작을 시도했으나 내 신념과는 맞지않기에 바로 취소했다.

아쉽지만 이미 지나간 일이니 다시 1일 1커밋을 진행한다.

 

solved.ac는 오전 6시 기준으로 날짜가 변경되기 때문에 스트릭이 이어지고 있다.

물론 백준은 깨졌다.

저 사이에 있는 빗금이 불편하다.

 

마무리

이제 곧 백수로 돌아간다.

백수인 상태에서 넥스터즈 23기 활동을 할 것이고, 프로젝트 참여 여부를 고민하고있다.

취업에 집중할건지 프로젝트 참여를 하면서 취준해도 될지 생각할 시간을 가져야될 것 같다.

그동안 나에게 휴식을 너무 안줬던것 같고, 기계처럼 커밋만 찍었던것 같다.

퇴사 직후에는 일단 어디든 혼자 돌아다녀보려고 한다.

그 후로는 재취업을 위해 달릴 것이다.

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

7월 회고  (0) 2023.08.04
6월 회고  (2) 2023.07.02
4월 4주차 결산  (2) 2023.05.01
4월 3주차 결산  (0) 2023.04.24
4월 2주차 결산  (0) 2023.04.17

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

 

25427번: DKSH를 찾아라

준혁이는 DKSH(단국대학교부속소프트웨어고등학교)에 다니는 학생이다. 어느 날, 준혁이는 길을 걷다가 $N$ 개의 알파벳 대문자가 써있는 종이를 발견했다. 평소에 자신이 DKSH에 다니는 학생이라

www.acmicpc.net

 

4개의 문자를 제외하고 모두 제거했을 때, 남은 문자열이 DKSH일 경우의 수를 구하는 문제입니다.

DKSH의 순서를 유지해야 하며, (a < b < c < d) 조건을 만족하는 (a, b, c, d) 쌍의 갯수를 구해야 합니다.

dp[idx][pos]: list의 idx번째 문자, DKSH 중 pos번쨰 문자를 확인할 때 "DKSH"를 만들 수 있는 경우의 수

 

우선 가장먼저 떠오른 방법이 재귀입니다.

pos == 4, 즉 DKSH를 모두 찾았다면 1을 리턴합니다.

DKSH를 모두 찾지 못했는데 list 내의 문자열을 모두 확인했다면 0을 리턴합니다.

모든 인덱스에 대해 해당 문자를 고르지 않고 idx + 1, pos번째 문자를 확인할 수 있습니다.

그리고 현재 idx번째 문자와 pos번째 문자가 일치하면 idx + 1, pos + 1번째 문자를 확인합니다.

두 가지의 경우를 모두 더해주시면 답이 되겠습니다.

 

여기까지 제가 생각했던 방법이고, 이 방법을 사용하지 않은 풀이도 존재합니다.

어떤 인덱스 idx를 기준으로 경우의 수를 조합하는 방법으로는

idx의 왼쪽에서 해당되는 문자의 갯수 * idx의 오른쪽에 해당되는 문자의 갯수로 구할 수 있습니다.

 

예시로 "YYYSSS"라는 문자열로 "YS"를 만들 수 있는 경우의 수는

왼쪽의 Y1 Y2 Y3 (3개) * 오른쪽의 S1 S2 S3 (3개) = 9로 구할 수 있습니다.

이를 변형해서 Y1 (S1 S2 S3) + Y2 (S1 S2 S3) + Y3 (S1 S2 S3)로도 구할 수 있으며, 이 문제는 이 방법을 이용합니다.

이 방법을 이용하여 해결할 수 있습니다.

찾은 문자에 대해서 왼쪽에 pos-1번 문자의 카운팅이 몇번 진행되었는지 확인만 해주면 됩니다.

'D'를 찾았다면 첫번째 문자이므로 d에 1을 더합니다.

'K'를 찾았다면 앞에 'D'가 카운팅 된 d를 k에 더해줍니다.

'S'를 찾았다면 앞에 'K'가 카운팅 된 k를 s에 더해줍니다.

'H'를 찾았다면 앞에 'S'가 카운팅 된 s를 h에 더해줍니다.

출력은 h를 해주시면 됩니다.

 

첫번째 방법
두번째 방법

역시 두번째 방법이 O(N)으로 끝나기 때문에 속도가 더 빠름을 알 수 있습니다.

 

 

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
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Main {
    private final static int MAX = 100000;
    private final static char pat[] = new char[]{'D''K''S''H'};
    private static char[] list;
    private static long dp[][] = new long[MAX][4];
    private static int N;
 
    private static long solve(int idx, int pos) {
        if (pos == 4return 1;
        if (idx == N) return 0;
        if (dp[idx][pos] != -1return dp[idx][pos];
        dp[idx][pos] = solve(idx + 1, pos);
 
        if (list[idx] == pat[pos]) {
            dp[idx][pos] += solve(idx + 1, pos + 1);
        }
 
        return dp[idx][pos];
    }
 
    private static void init() {
        for (int i = 0; i < N; i++) {
            Arrays.fill(dp[i], -1);
        }
    }
 
    private static void func() {
        init();
        System.out.println(solve(00));
    }
 
    private static void input() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
 
        st = new StringTokenizer(br.readLine());
        list = st.nextToken().toCharArray();
    }
 
    public static void main(String[] args) throws Exception {
        input();
        func();
    }
}
 
cs

 

 

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
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main {
    private static char[] list;
    private static int N;
 
    private static void func() {
        long d = 0;
        long k = 0;
        long s = 0;
        long h = 0;
        for (int i = 0; i < N; i++) {
            if (list[i] == 'D') d++;
            else if (list[i] == 'K') k += d;
            else if (list[i] == 'S') s += k;
            else if (list[i] == 'H') h += s;
        }
 
        System.out.println(h);
    }
 
    private static void input() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
 
        st = new StringTokenizer(br.readLine());
        list = st.nextToken().toCharArray();
    }
 
    public static void main(String[] args) throws Exception {
        input();
        func();
    }
}
 
cs

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

boj 28018 시간이 겹칠까?  (0) 2023.08.08
boj 12841 정보대 등산  (0) 2023.07.31
boj 25682 체스판 다시 칠하기 2  (0) 2023.02.26
boj 12996 Acka  (0) 2023.01.29
boj 14450 Hoof, Paper, Scissors (Gold)  (0) 2022.12.30

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

 

1456번: 거의 소수

어떤 수가 소수의 N제곱(N ≥ 2) 꼴일 때, 그 수를 거의 소수라고 한다. 두 정수 A와 B가 주어지면, A보다 크거나 같고, B보다 작거나 같은 거의 소수가 몇 개인지 출력한다.

www.acmicpc.net

정수론 문제는 처음이네요?

 

이 문제에서 요구하는 거의 소수란, 어떤 소수의 N제곱(N >= 2) 꼴이 되는 수라고 합니다.

즉, 8은 2의 3제곱이므로 거의 소수이며, 1024는 2의 10제곱이므로 거의 소수가 됩니다.

주어지는 [A ~ B]의 구간에서 거의 소수의 갯수를 구하는 문제입니다.

 

먼저 소수를 알아야하므로 에라토스테네스의 체로 소수를 모두 구합니다.

범위가 10^14까지인데, 어떤 소수의 제곱이 10^14이하가 되는거라 10^7까지의 소수만 구하도록 합니다.

 

그리고 2부터 1씩 증가하면서 i가 소수인지 확인을 합니다.

소수가 맞다면 i의 n제곱이 r이하일 동안에는 계속 i를 곱해줍니다.

이 과정에서 l 이상, r 이하일 동안은 카운팅을 진행합니다.

어차피 소수 i의 n제곱이고, 그 수는 다른 소수를 곱해서는 도달할 수 없는 수입니다.

 

이 과정에서 문제가 있었습니다.

i를 계속 곱하는 과정에서 수가 long 범위를 벗어나는 경우입니다.

어떤 소수를 n제곱 하면 long 범위를 초과했고, 음수 값이 되어 r을 넘는 값임에도 계속 반복문을 도는 문제가 있었습니다.

 

결국에는 WA를 받게되었고, i를 1번 덜 곱하는 방법으로 해결하였습니다.

i * i <= r 이라는 식을 i <= r / i 로 변경하여 곱셈을 진행하였고, 이 방법으로는 long 범위를 초과하지 않는다는 것을 확인했습니다.

 

 

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
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main {
    private final static int MAX = 10000001;
    private static boolean prime[] = new boolean[MAX];
    private static long l, r;
 
    private static void init() {
        for (int i = 2; i * i < MAX; i++) {
            if (prime[i]) continue;
 
            for (int j = 2; i * j < MAX; j++) {
                prime[i * j] = true;
            }
        }
    }
 
    private static void func() {
        init();
 
        int ret = 0;
        for (long i = 2; i * i <= r; i++) {
            if (prime[(int) i]) continue;
            long mul = i;
            while (mul <= r / i) {
                mul *= i;
                
                if (mul >= l) {
                    ret++;
                }
            }
        }
 
        System.out.println(ret);
    }
 
    private static void input() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        l = Long.parseLong(st.nextToken());
        r = Long.parseLong(st.nextToken());
    }
 
    public static void main(String[] args) throws Exception {
        input();
        func();
    }
}
 
cs

알고리즘

1일 1알고리즘

 

RealMySQL 스터디

넥스터즈 운영진 일과 몇몇 일들이 겹쳐 이번주 분량을 채우지 못했다.

다음주에는 당연히 남은 분량을 채워야되겠고, 다음주는 확실하게 준비해야 될 것이다.

벌써 5주라는 시간이 흘렀고 시간이 좀더 지났을때 과거에 정리했던 내용들 보면서 적어도 이해할 정도는 돼야하지않을까 생각한다.

 

후기

블로그 포스팅에 변화를 가져가려고 한다.

매주 작성한 주단위 결산들을 보면서 무작정 찍어내는 것처럼 보여서 의미가 없다는 생각이 들었고,

월단위 포스팅으로 변경해도 무방하다는 생각이 들었다.

 

그리고 주단위로는 내가 공부한 내용 또는 알고리즘 포스팅을 할 계획이다.

얼마나 지켜질지는 지켜봐야겠지만 좀더 의미있는 포스팅을 하기 위함이다.

내가 참고하기 위해 포스팅하는 것이지만

알고리즘이든 개발지식이든 글을 보고 유익함을 느끼는 분이 소수나마 있는걸 알기에 최대한 정확한 정보를 전달하기 위해 노력할 것이다.

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

6월 회고  (2) 2023.07.02
5월 회고  (4) 2023.06.01
4월 3주차 결산  (0) 2023.04.24
4월 2주차 결산  (0) 2023.04.17
4월 1주차 결산  (4) 2023.04.10

알고리즘

1일 1알고리즘

 

RealMySQL 스터디

이번주차로 3주차가 진행되었다.

생각보다 내용이 어려웠고, 무엇보다 저번에 진행했던 내용들과 내가 정리했던 내용들을 기억하지 못한다는 문제점을 발견했다.

요즘 나에게 맞는 효율적인 공부법을 찾아보고 있지만 쉽지는 않은것 같다.

이번주차도 일단 다음주차 분량을 정했지만.. 아직.. 아무것도.. 정리하지 않았다. ㅎㅎ

 

Nexters 서버 관련

나는 Nexters 23기 운영진이고, CTO를 맡고있다.

CTO로서 홈페이지 관리를 하고있으며, 이번주는 모집이 공개되는 날이므로 이 일에 집중했다.

근데 코드를 수정하고 github에 업로드하는 과정에서 문제가 발생했다.

규칙이나 그런걸 미숙지한 상태라서 건드리면 안될 코드를 건드렸고, 복구하고 다시 올리는 과정을 거쳤다.

우리 운영진들 모두 인수인계를 받지 못한 부분이라 많이 당황했지만 수습중이다.

 

후기

모집일이 슬슬 다가오면서 바빠지고 있는데

문제는 아직 모집이 시작도 안됐다는 것이다.

우선 급한불은 끈것 같지만 앞으로 해야할 일들을 정리해나갈 것이다.

https://teamnexters.com/

 

NEXTERS : IT Community for Experts

 

teamnexters.com

넥스터즈 23기 모집이 곧 시작되니 지원 많이 해주시면 감사하겠습니다!

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

5월 회고  (4) 2023.06.01
4월 4주차 결산  (2) 2023.05.01
4월 2주차 결산  (0) 2023.04.17
4월 1주차 결산  (4) 2023.04.10
3월 5주차 결산  (2) 2023.04.03

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

 

27977번: 킥보드로 등교하기

첫 번째 줄에 학교까지의 거리, 킥보드 충전소의 개수, 최대 충전소 방문 횟수를 나타내는 세 정수 $L, N, K$가 공백으로 구분되어 주어진다. 두 번째 줄에 $i$번째 충전소의 위치를 나타내는 $N$개

www.acmicpc.net

지인분이 출제한 대회문제가 백준에 등록되었습니다.

문제출제라니.. 무슨 문제를 만들어야하고, 테케는 어떻게 만드는지 모르는 입장에서 그저 신기하네요 ㅋㅋㅋ

다행히 제가 풀수있는 문제를 만들어 주셨습니다 ㅎㅎ

 

이 문제는 0에서 출발하여 L까지 정해진 배터리 용량으로 목적지까지 가야합니다.

충전소는 N개, A[i] 지점마다 있으며, 최대 K번 충전이 가능합니다.

이 때 최초 구매할 수 있는 배터리 용량의 최소를 구하는 문제입니다.

 

최종으로 구해야 하는건 배터리 용량의 최소이므로 이를 파라매트릭 서치로 구해야 합니다.

목적지까지는 갈 수 있어야하므로 최소 용량 l은 maxDis가 되겠고, 최대 용량 r은 출발지점에서 목적지까지의 거리 L이 되겠습니다.

maxDis는 출발지점과 첫 번째 충전소, 각 인접한 충전소들, 마지막 충전소와 도착지점 사이의 거리의 최대입니다.

그리고 계산의 편의를 위해 배열에 도착지점인 L을 추가합니다.

이 문제는 충전소의 위치가 정렬된 상태로 주어지므로 정렬로직이 필요 없습니다.

 

그러면 배터리 용량이 m이라고 했을 때, 충전소를 K번 이하 방문하면서 목적지점인 L 까지 갈 수 있는지 확인합니다.

L에 도착했을 때 충전소를 K번 이하로 방문할 수 있다면 ret을 갱신하고 범위를 작게 맞춰서 최적 해를 구합니다.

 

 

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
58
59
60
61
62
#include <iostream>
#include <algorithm>
#define MAX_N 100001
using namespace std;
 
int list[MAX_N];
int L, N, K, maxDis;
 
void func() {
    int l = maxDis;
    int r = L;
 
    int ret = 0;
    while (l <= r) {
        int m = (l + r) / 2;
 
        int now = m;
        int pos = 0;
        int cnt = 0;
        for (int i = 0; i < N; i++) {
            if (list[i] - pos > now) {
                cnt++;
                now = m;
            }
            now -= (list[i] - pos);
            pos = list[i];
        }
 
        if (cnt <= K) {
            ret = m;
            r = m - 1;
        }
        else {
            l = m + 1;
        }
    }
 
    cout << ret << '\n';
}
 
void input() {
    cin >> L >> N >> K;
 
    int pre = 0;
    for (int i = 0; i < N; i++) {
        cin >> list[i];
        maxDis = max(maxDis, list[i] - pre);
        pre = list[i];
    }
    maxDis = max(maxDis, L - pre);
    list[N++= L;
}
 
int main() {
    cin.tie(NULL); cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    input();
    func();
 
    return 0;
}
cs

 

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

boj 18113 그르다 김가놈  (0) 2022.10.09
boj 2295 세 수의 합  (0) 2022.06.28
boj 2110 공유기 설치  (0) 2021.04.13
boj 7453 합이 0인 네 정수  (0) 2021.01.22
boj 2143 두 배열의 합  (0) 2021.01.22

알고리즘

1일 1알고리즘

 

RealMySQL 스터디

1주차에 비해 내용이 많이 어려웠다.

크게 InnoDB 스토리지 엔진의 특징과 InnoDB 버퍼 풀에 대한 내용이었고, 나는 당연히 처음보는 개념들이었다.

일단 처음보는 내용들이라 내용정리는 최대한 많이 해보려고 했고, 그 과정에서 이해해보려고 했지만 생각보다 어려웠다.

다행히도 스터디원 모두가 어려워했던 내용이라 집단지성으로 의견을 나누면서 진행되었기 때문에 이해되는데 많은 도움이 되었다.

다음주 내용도 얼른 정리 해야되는데.. 아직 하나도 못해서 걱정이네 ㅎㅎㅎ

 

후기

요즘 너무 늦게자는것 같은데.. 일찍 자야할텐데 생각보다 할일이 많은것 같다.

막상 깨어있는 시간에 비해 얻어가는게 많지 않다는 생각이 들어서 효율적으로 공부할 수 있도록 노력해야겠다.

두달째 알고리즘 안올리는중 ㅎㅎㅎ.. 정신차리자

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

4월 4주차 결산  (2) 2023.05.01
4월 3주차 결산  (0) 2023.04.24
4월 1주차 결산  (4) 2023.04.10
3월 5주차 결산  (2) 2023.04.03
3월 4주차 결산  (0) 2023.03.27

알고리즘

1일 1알고리즘

 

RealMySQL 스터디

스터디 1주차가 시작되었다.

스터디 시작 전에 각자 개념을 정리하여 GitHub에 pr을 올리고, discussions에 질문들을 등록했다.

이번주 스터디에서 느낀건 토론방식인데 대화에 참여할 수 없는 주제가 많았다는 점이다.

그만큼 내가 모르는게 많다는 건 사실이고, 많이 배울수 있겠다는 생각에 오히려 좋다는 생각은 들었다. 하지만 민폐는 안되는게 맞다.

처음 해보는 방식인데 괜찮았던것 같고, 다음 주차에는 더 준비 잘해야겠다는 생각이 들었다.

 

후기

저번에 PCCP 시험 후기글을 포스팅했었는데 이게 이벤트 당첨이 되어 키보드를 배송받았다. ㅎㅎ 감사합니다! 인생 살만하다고 느껴요.

프로그래머스에서 썸머 인턴 모집이 시작되었다고 메일이 왔다.

똑같이 코딩테스트를 보고, 면접보는 방식은 이전에 하던 방식과 동일한데

나는 PCCP 시험에서 LV4 등급을 받았으므로 코딩테스트에서 면제라고 하더라.

페이지를 들어가서 확인하니 PCCP LV4부터 코딩테스트가 면제된다는 공지가 있었다.

PCCP 시험은 매달 진행되니 한번 해보는 것도 괜찮을것 같다.

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

4월 3주차 결산  (0) 2023.04.24
4월 2주차 결산  (0) 2023.04.17
3월 5주차 결산  (2) 2023.04.03
3월 4주차 결산  (0) 2023.03.27
3월 3주차 결산  (0) 2023.03.20

+ Recent posts