From 6cafddf41059cab0345e18162daa429531af22e7 Mon Sep 17 00:00:00 2001 From: Cycrypto Date: Sun, 8 Oct 2023 22:25:33 +0900 Subject: [PATCH 1/2] =?UTF-8?q?10=EC=9B=94=202=EC=A3=BC=EC=B0=A8=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ParkJunHa/.DS_Store | Bin 0 -> 8196 bytes .../\353\271\227\353\254\274.py" | 22 +++++++++++++ ...4\354\240\204_\354\264\210\353\260\245.py" | 29 ++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 ParkJunHa/.DS_Store create mode 100644 "ParkJunHa/10\354\233\224 2\354\243\274\354\260\250/\353\271\227\353\254\274.py" create mode 100644 "ParkJunHa/10\354\233\224 2\354\243\274\354\260\250/\355\232\214\354\240\204_\354\264\210\353\260\245.py" diff --git a/ParkJunHa/.DS_Store b/ParkJunHa/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..de5ad762b3342ee240ccc17ea8affa95c099bc60 GIT binary patch literal 8196 zcmeHMPmj_-6n_Kg7Ewcu8jejocp(bAxMtl;MLc*h#u`1i2HS<~Hd{IbiW~?Dw@vgz zc=Wg)J)8Iy{04pt6MgfC(m*S^2jidjl9}Ih=Dp6m-vUAVt^PR28aP-;7?!x?`$DP#=WmbsU`-9 zf&Y>LaXwgB1lk&B3gyv(l}rH;3)n3M+hx%}v^3fpX9{ryg(*`+Wy*Al!IU}nTUyW7 zI8&(1f$8Lf>6w|%P?($@-)~8EV75Z4i2-6@l>w2vm!J+cvt;sQ{%*R#LEYKsy?(+d zL$k+QEid36Y8uCPzC0ZGpYCSAx5qobpxr-QS;aZniC5cDUmHyKLBRL*8pIJG=D+bx z3bp`JZM^ZYuWdef{lFhawc2Nv%NNd^-7q$clJUYhlg61`LolCk^9-a7d`8M_SK zMda4${%qV{IfF3Z;Q{&~d`!-JYaZJ*zQlS-U)sm-b6?#RUlO_tU)JfS_)>rnI7HB0 z+IJ`DLvr86djH5?i~UK7Nj#Q}!=v4Im#(Wll^9=epEmv@zL)k3-T%1ZNQi+`FpyU^ z6_Nkn&;I^@iZ_!9F+dFbEex9u)czAZehA82GIWd= k-1: + max_cnt = max(max_cnt,len(eat)) + print(max_cnt) + eat[sushi[left]] -= 1 + if eat[sushi[left]] == 0: + del eat[sushi[left]] + left += 1 + +print(max_cnt) \ No newline at end of file From ff40665d12a3bbf98a45b8fa5c3ab10af7e19d2e Mon Sep 17 00:00:00 2001 From: Cycrypto Date: Mon, 9 Oct 2023 18:37:29 +0900 Subject: [PATCH 2/2] =?UTF-8?q?add:=2010=EC=9B=94=202=EC=A3=BC=EC=B0=A8=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ParkJunHa/.DS_Store | Bin 8196 -> 8196 bytes .../\352\260\200\353\245\264\354\271\250.py" | 26 +++++ ...2-\352\260\200\353\245\264\354\271\250.md" | 56 +++++++++++ .../note/14179-\353\271\227\353\254\274.md" | 52 ++++++++++ ...14\354\240\204\354\264\210\353\260\245.md" | 95 ++++++++++++++++++ 5 files changed, 229 insertions(+) create mode 100644 "ParkJunHa/10\354\233\224 2\354\243\274\354\260\250/\352\260\200\353\245\264\354\271\250.py" create mode 100644 "ParkJunHa/note/1062-\352\260\200\353\245\264\354\271\250.md" create mode 100644 "ParkJunHa/note/14179-\353\271\227\353\254\274.md" create mode 100644 "ParkJunHa/note/15961-\355\232\214\354\240\204\354\264\210\353\260\245.md" diff --git a/ParkJunHa/.DS_Store b/ParkJunHa/.DS_Store index de5ad762b3342ee240ccc17ea8affa95c099bc60..6941905ceac128155e951a9d3bd35f8933173149 100644 GIT binary patch delta 78 zcmV-U0I~msK!iY$PXQRQP`eKS7?TVTvy(Xx7n6(<8Z*FG*0005AKog4rv2^kRvj-UV1e3EA7_oHk0u6^72><{9 delta 53 zcmV-50LuS_K!iY$PXQLOP`eKS7LyDRvy&YX6|?#fZvvD36bZAI6Mq4d)Ep_XcoPG& L2N?DQv3Lgq?wb-j diff --git "a/ParkJunHa/10\354\233\224 2\354\243\274\354\260\250/\352\260\200\353\245\264\354\271\250.py" "b/ParkJunHa/10\354\233\224 2\354\243\274\354\260\250/\352\260\200\353\245\264\354\271\250.py" new file mode 100644 index 0000000..f3f1f4c --- /dev/null +++ "b/ParkJunHa/10\354\233\224 2\354\243\274\354\260\250/\352\260\200\353\245\264\354\271\250.py" @@ -0,0 +1,26 @@ +from string import ascii_lowercase +from itertools import combinations + +n, k = map(int, input().split()) +k -= 5 + +remains = {'a', 'c', 'i', 'n', 't'} +alpha = {*ascii_lowercase} - remains +if k < 0: + print(0) + exit() + +mx = 0 + +strset = [{*input()} for _ in range(n)] +for c in combinations(alpha, k): + tmp = 0 + remains = remains | {*c} + for s in strset: + if remains.issuperset(s): + # print(remains, *c) + tmp += 1 + + remains = remains - {*c} + mx = max(mx, tmp) +print(mx) \ No newline at end of file diff --git "a/ParkJunHa/note/1062-\352\260\200\353\245\264\354\271\250.md" "b/ParkJunHa/note/1062-\352\260\200\353\245\264\354\271\250.md" new file mode 100644 index 0000000..b60130d --- /dev/null +++ "b/ParkJunHa/note/1062-\352\260\200\353\245\264\354\271\250.md" @@ -0,0 +1,56 @@ +--- +platform: BOJ +link: https://www.acmicpc.net/problem/1062 +tags: + - bitmask + - bruteforcing +difficulty: g4 +정답 참조: +is_study: true +week-date: + - 10월 + - 2주차 +--- +`=this.file.tags` + +# \[`=this.file.frontmatter.platform`\]`=this.file.name` + + +### 풀이 +#### 아이디어 +일단 남극어는 anta - tica 구조이므로 집합 {a,c,i,n,t}를 제외한 나머지 조합탐색을 통해서 한다. +무작정 찾게 되면 시간 낭비가 날 것 같아 set 자료구조를 사용했다. + +그래서 단어를 입력받고, 각 단어마다 백트래킹과 유사한 방식으로 탐색한 조합을 remains에 넣었다 뺐다 하면서 최댓값을 찾는 방식으로 진행하였다. +#### 코드 +```python +from string import ascii_lowercase +from itertools import combinations + +n, k = map(int, input().split()) +k -= 5 + +remains = {'a', 'c', 'i', 'n', 't'} +alpha = {*ascii_lowercase} - remains +if k < 0: + print(0) + exit() + +mx = 0 + +strset = [{*input()} for _ in range(n)] +for c in combinations(alpha, k): + tmp = 0 + remains = remains | {*c} + for s in strset: + if remains.issuperset(s): + # print(remains, *c) + tmp += 1 + + remains = remains - {*c} + mx = max(mx, tmp) +print(mx) +``` +--- +### 회고 +이게 되네 \ No newline at end of file diff --git "a/ParkJunHa/note/14179-\353\271\227\353\254\274.md" "b/ParkJunHa/note/14179-\353\271\227\353\254\274.md" new file mode 100644 index 0000000..a9db875 --- /dev/null +++ "b/ParkJunHa/note/14179-\353\271\227\353\254\274.md" @@ -0,0 +1,52 @@ +--- +platform: BOJ +link: https://www.acmicpc.net/problem/14179 +tags: + - implements + - simulation +difficulty: g5 +정답 참조: +is_study: true +week-date: + - 10월 + - 2주차 +--- + +# \[`=this.file.frontmatter.platform`\]`=this.file.name` + + +### 풀이 +#### 아이디어 +우선 width, height대로 실제 그래프를 만들고, 빗물이 떨어진다면 아래의 조건을 만족한 경우 빗물이 고일수 있으므로 그대로 구현하였다. +1. 일단 비는 내린다 +2. 양쪽이 막혔는지 확인한다. +3. 만약 막히지 않는 곳이라면 그 위로부터는 쌓지 못한다. +#### 코드 +```python +width, height = map(int, input().split()) +stack = map(int, input().split()) +graph = [[0]* height for _ in range(width)] +res = 0 + +for i, s in enumerate(stack): + for j in range(s): + graph[j][i] = 1 + +for i in range(width): + for j in range(height): + if graph[i][j] == 0: + graph[i][j] = 9 + + for k in range(height): + if graph[i][k] == 9: + try: + w_s, w_e = graph[i][:k].index(1), graph[i][k+1:].index(1) + except ValueError: + graph[i][k] = -1 + +print(sum(graph, []).count(9)) + +``` +--- +### 회고 +간만에 힐링문제였다. 요즘 PS문제를 어려운것밖에 안해서 흥미가 떨어질뻔 했는데 뇌 빼고 해도 풀리는 문제 하니 다시 재밌어졌다. 다만 위 문제 조건에서 아무리 해봐야 최종 계산이 1억을 넘지 않는다는것을 확인했고 그래서 뇌빼고 풀 수 있었던거라 숫자가 커지면 시간복잡도는 지수시간 비스무리하게 커질것으로 보인다. 또한 PS에서 count라던가 index라던가 뭐 del이라던가 이런 인스턴스들 쓰는거 별로 안좋아하는데 그런면에서는 마음에 들지 않은 코드이다. \ No newline at end of file diff --git "a/ParkJunHa/note/15961-\355\232\214\354\240\204\354\264\210\353\260\245.md" "b/ParkJunHa/note/15961-\355\232\214\354\240\204\354\264\210\353\260\245.md" new file mode 100644 index 0000000..7209551 --- /dev/null +++ "b/ParkJunHa/note/15961-\355\232\214\354\240\204\354\264\210\353\260\245.md" @@ -0,0 +1,95 @@ +--- +platform: BOJ +link: https://www.acmicpc.net/problem/15961 +tags: + - two_pointer + - sliding_window +difficulty: g4 +정답 참조: true +is_study: true +week-date: + - 10월 + - 2주차 +--- + +# \[`=this.file.frontmatter.platform`\]`=this.file.name` + + +### 풀이 +#### 아이디어 +우선 코드부터 첨부한다. +```python +import sys +input = sys.stdin.readline + +plate, kinda, series, cupon = map(int, input().split()) +lane = list(int(input()) for _ in range(plate))*2 +# res = [[0, 0] for _ in range(plate+1)] # 가짓수, 종류수 +res = [0]*(plate+1) + +sp, ep = 0, series + +while sp <= plate: + window, kind = lane[sp:ep], len(set(lane[sp:ep])) + # print(window, kind) + # res[sp][0], res[sp][1] = kind, kind + res[sp] = kind + if cupon not in window: + # res[sp][0] += 1 + res[sp] += 1 + + sp, ep = sp+1, ep+1 + +# print(sorted(res, key = lambda x:(-x[0], -x[1]))) +print(max(res)) +``` +아이디어는 연속으로 먹은 초밥을 슬라이싱하고, 최대한 많은 종류의 초밥을 먹어야하므로, `set`을 이용해서 중복을 제거한 개수를 저장해주었다. + +지금 와서 보니까 문제를 잘못읽은 부분이 있는데, 만약 쿠폰으로 받은 초밥번호가 내가 연속으로 먹는 초밥 시리즈에 없다면 1개를 더해준다. 이부분은 문제에서 "초밥이 없다면 만들어준다"라는 조건을 빼고 봐서 그렇다. + +이 코드는 우선 시간초과가 발생한다. 그도그럴것이 6백만 크기의 리스트 인덱싱을 반복하니까 $N \times (N-1)$정도의 연산이 반복된다. 또한 인덱싱은 인덱싱 크기만큼의 연산이 추가로 필요하므로 series를 s라고 했을때 저기에 s를 또 곱해줘야한다.. + + +#### 코드 +```python +import sys +input = sys.stdin.readline +from collections import defaultdict + +N, d, k, c = map(int,input().split()) +sushi = [] +for _ in range(N): + sushi.append(int(input())) +sushi.extend(sushi) + +left = 0 +right = 0 +max_cnt = 0 +eat = defaultdict(int) + +eat[c] += 1 + +for right in range(len(sushi)): + eat[sushi[right]] += 1 + + if right >= k-1: + max_cnt = max(max_cnt,len(eat)) + eat[sushi[left]] -= 1 + if eat[sushi[left]] == 0: + del eat[sushi[left]] + left += 1 + +print(max_cnt) +``` +1. 나는 리스트 크기를 2배로 늘릴때 곱 연산을 이용했지만 코드에서는 `.extend()`를 사용했다. +2. `eat`이라는 변수에 값이 없는 딕셔너리 (default dict)을 생성하였고, 실제로 시뮬레이션 하듯이 먹고 빼고를 반복한다. +3. 쿠폰으로 주는 초밥은 무조건 먹으므로 c에 1을 더해준다. +4. 슬라이딩 윈도우를 적용해주는데, k 만큼은 무조건 먹고, 만약 오른쪽 포인터가 그 이상이 갔을때, 왼쪽 포인터를 옮겨주고, 해당 위치에 있는 초밥의 개수를 줄여준다 +5. 만약 초밥을 줄였을때 개수가 0이라면 해당 키를 삭제시켜 개수를 업데이트해준다. + + +> 즉 딕셔너리가 저장하는 값은 각각의 번호의 초밥을 몇개 먹었는가? 를 저장하며, 그 종류의 개수를 세어 가장 큰 값을 정답으로 한다. + +--- +### 회고 +슬라이딩 윈도우라는 주제를 제대로 풀어본적이 없어 아이디어를 떠올리기 쉽지 않았던 문제. \ No newline at end of file