2024-TEAM-05 / algorithm-for-kakao

카카였 기좜 문제 κ°€μ¦ˆμ•„πŸ£
0 stars 0 forks source link

[2024 KAKAO WINTER INTERNSHIP] n + 1 μΉ΄λ“œκ²Œμž„ #4

Open uijin-j opened 2 months ago

uijin-j commented 2 months ago

πŸ”— n + 1 μΉ΄λ“œκ²Œμž„

uijin-j commented 1 month ago

πŸ“‘ λŒ“κΈ€ ν…œν”Œλ¦Ώ

μ½”λ“œ 풀이

```java // 풀이 μ½”λ“œ ... ```

μ½”λ©˜νŠΈ

- OOO 뢀뢄이 μ–΄λ €μ›Œμ„œ μ’€ μ˜€λž˜κ±Έλ Έλ„€μš”!
- OO ν‚€μ›Œλ“œλ₯Ό 보고 이뢄탐색을 λ– μ˜¬λ ΈμŠ΅λ‹ˆλ‹€!
hye-on commented 1 month ago

μ½”λ“œ 풀이

```c++ #include #include #include using namespace std; //1:14 ~ 2:59 = 1μ‹œκ°„ 45λΆ„ //처음 μ„ΈνŒ… // 1 2 3 4 5 6 7 8 9 10 11 12 13 // 짝이 μ •ν•΄μ Έ μžˆλ‹€. bool num[1001]; bool st[1001]; int p1,p2; bool nocard=false; int solution(int coin, vector cards) { int answer = 0; int n = cards.size(); // n/3은 μ΄ˆκΈ°μ— 가지고 있음 int k=0,k2=0; for(int i=0;i0 && num[n+1 - p1]) { coin--; num[p1]=false; num[n+1-p1] = false; k++; }//μ•žμ— λ‚˜μ™”λ˜ κ²ƒκΉŒμ§€ 같이 μ‚°λ‹€λ©΄ νŒ¨μŠ€ν•  수 있음 -> ν›„λ³΄λ‘œ 등둝 else if(coin> 1 &&st[n+1 - p1]){ k2++; } if(coin >0 && num[n+1 - p2]) { coin--; num[p2]=false; num[n+1-p2] = false; k++; } else if(coin> 1 &&st[n+1 - p2]){ k2++; } //μ•žμ— λ‚˜μ™”λ˜ 것듀을 ν‘œμ‹œ st[p1]=true; st[p2]=true; //뽑은 2개끼리 n+1이 될 수 μžˆλ‹€λ©΄ ν›„λ³΄λ‘œ ν‘œμ‹œ if(coin>1 &&(p1+p2)== (n+1) ){ k2++; } if(k>0){ //가지고 있던 짝(n+1) 씀 k--; r++; }else if(coin>1 && k2>0){ //μ—†λ‹€λ©΄ κ°€λŠ₯ν•œν›„λ³΄ 씀. 그리고 coin-=2 k2--; coin-=2; r++; } else{ //λΌμš΄λ“œ 진행λͺ»ν•˜λ©΄ 끝 break; } } return answer = r; } ```

μ½”λ©˜νŠΈ

- μƒˆλ²½μ— ν‘Έλ‹ˆκΉŒ 머리가 μ•ˆλŒμ•„κ°€λ„€μš”
- coin을 λ‹Ήμž₯ 쓸지 λ‚˜μ€‘μ— 쓸지λ₯Ό μ’€ 더 κ³ λ―Όν–ˆμœΌλ©΄ 더 빨리 ν’€μ—ˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€.
uijin-j commented 1 month ago

πŸ“‘ λŒ“κΈ€ ν…œν”Œλ¦Ώ

μ½”λ“œ 풀이

```java import java.util.*; // 03:09 START! 04:09 END! (1μ‹œκ°„ κ±Έλ¦Ό) // 그리디, Set 자료ꡬ쑰 class Solution { /** * κ·Έλ¦¬λ””λŠ” 아닐 것 κ°™μ•˜λŠ”λ°, νˆ¬ν¬μΈν„°λ‘œ ν’€λ €λ‹€ 그리디!πŸ˜… * λ§Œμ•½ 이미 손에 μžˆλŠ” μΉ΄λ“œμ™€ 쌍이 λ˜λŠ” μΉ΄λ“œκ°€ 있으면 λ°”λ‘œ 코인 1개 μ£Όκ³  사기! * λ§Œμ•½ 손에 μžˆλŠ” μΉ΄λ“œμ™€ 쌍이 λ˜μ§€ μ•ŠμœΌλ©΄ save, 이후 쌍이 λ˜λŠ” μΉ΄λ“œκ°€ λ‚˜μ˜€λ©΄ κΈ°μ–΅ν–ˆλ‹€κ°€, μ΅œμ•…μ˜ 경우 코인 2개 μ£Όκ³  사기! */ public int solution(int coin, int[] cards) { int answer = 1; // μ΅œμ†Œ 1λΌμš΄λ“œ passs int n = cards.length; int terget = n + 1; Set mine = new HashSet<>(); // λ‚΄ 손에 μžˆλŠ” μΉ΄λ“œ int pair = 0; // λ‚΄κ°€ 가진 합이 n+1인 μΉ΄λ“œμŒ for(int i = 0; i < n / 3; ++i) { if(mine.contains(terget - cards[i])) { pair++; // νŽ˜μ–΄λ₯Ό 찾아도 setμ—μ„œ μ‚­μ œν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ”, μ€‘λ³΅λ˜λŠ” μˆ˜κ°€ μ—†κΈ° λ•Œλ¬Έ! (μ ˆλŒ€ μ–˜λž‘ νŽ˜μ–΄μΈ μˆ˜κ°€ 또 λ‚˜μ˜¬ 수 μ—†μŒ!) continue; } mine.add(cards[i]); } Set save = new HashSet<>(); // λ‚΄ 손에 μžˆμ§„ μ•Šμ§€λ§Œ, λ‚΄κ°€ μ½”μΈμ¨μ„œ κ°€μ Έμ˜¬ 수 μžˆλŠ” μΉ΄λ“œ int pairInSave = 0; // save에 μžˆλŠ” 합이 n+1인 μΉ΄λ“œμŒ for(int i = n / 3; i < n; i += 2) { // ν•œ λΌμš΄λ“œμ”© 진행 for(int j = i; j < i + 2; ++j) { // ν•œ λΌμš΄λ“œμ— 2μž₯μ”© 확인 if(mine.contains(terget - cards[j])) { // 코인을 ν•˜λ‚˜λ§Œ 써도 되기 λ•Œλ¬Έμ— κ°€μ Έκ°€λŠ”κ²Œ 이득! if(coin <= 0) break; // 코인 μ—†μœΌλ©΄ bye.. coin--; pair++; continue; } if(save.contains(terget - cards[j])) { pairInSave++; // 일단 보λ₯˜ } save.add(cards[j]); } // λΌμš΄λ“œ 끗 if(pair == 0) { if(pairInSave > 0 && coin >= 2) { pairInSave--; coin -= 2; answer++; continue; } // μ’…λ£Œ return answer; } pair--; answer++; } return answer; } } ```

μ½”λ©˜νŠΈ

- 문제 μœ ν˜• νŒŒμ•…ν•˜λŠ”κ²Œ 쑰금 였래 걸렸던 것 κ°™μŠ΅λ‹ˆλ‹€..
- 전에 μˆœμ„œκ°€ κ³ μ •λœ λ°°μ—΄μ—μ„œ 두 수의 합이 x인 νŽ˜μ–΄λ₯Ό ꡬ할 λ•Œ Map을 썼던 기얡이 λ‚˜μ„œ, μ‘μš©ν•΄μ„œ μ“΄ 것 κ°™μ•„μš”! μ—­μ‹œ 문제λ₯Ό 많이 ν’€μ–΄μ•Ό 아이디어 λ– μ˜¬λ¦¬κΈ° μ‰¬μš΄ 것 κ°™μŠ΅λ‹ˆλ‹Ή..