πŸ”₯ PS(Problem Solving) πŸ”₯/programmers

[programmers] 완전탐색, λͺ¨μ˜κ³ μ‚¬

dar0m! 2020. 3. 11. 00:30
 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - λͺ¨μ˜κ³ μ‚¬ | ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μˆ˜ν¬μžλŠ” μˆ˜ν•™μ„ ν¬κΈ°ν•œ μ‚¬λžŒμ˜ μ€€λ§μž…λ‹ˆλ‹€. 수포자 삼인방은 λͺ¨μ˜κ³ μ‚¬μ— μˆ˜ν•™ 문제λ₯Ό μ „λΆ€ 찍으렀 ν•©λ‹ˆλ‹€. μˆ˜ν¬μžλŠ” 1번 λ¬Έμ œλΆ€ν„° λ§ˆμ§€λ§‰ λ¬Έμ œκΉŒμ§€ λ‹€μŒκ³Ό 같이 μ°μŠ΅λ‹ˆλ‹€. 1번 μˆ˜ν¬μžκ°€ μ°λŠ” 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... 2번 μˆ˜ν¬μžκ°€ μ°λŠ” 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... 3번 μˆ˜ν¬μžκ°€ μ°λŠ” 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3,

programmers.co.kr

문제

μˆ˜ν¬μžλŠ” μˆ˜ν•™μ„ ν¬κΈ°ν•œ μ‚¬λžŒμ˜ μ€€λ§μž…λ‹ˆλ‹€. 수포자 삼인방은 λͺ¨μ˜κ³ μ‚¬μ— μˆ˜ν•™ 문제λ₯Ό μ „λΆ€ 찍으렀 ν•©λ‹ˆλ‹€. μˆ˜ν¬μžλŠ” 1번 λ¬Έμ œλΆ€ν„° λ§ˆμ§€λ§‰ λ¬Έμ œκΉŒμ§€ λ‹€μŒκ³Ό 같이 μ°μŠ΅λ‹ˆλ‹€.

  • 1번 μˆ˜ν¬μžκ°€ μ°λŠ” 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
  • 2번 μˆ˜ν¬μžκ°€ μ°λŠ” 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
  • 3번 μˆ˜ν¬μžκ°€ μ°λŠ” 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 λ¬Έμ œλΆ€ν„° λ§ˆμ§€λ§‰ λ¬Έμ œκΉŒμ§€μ˜ 정닡이 μˆœμ„œλŒ€λ‘œ 듀은 λ°°μ—΄ answersκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, κ°€μž₯ λ§Žμ€ 문제λ₯Ό 맞힌 μ‚¬λžŒμ΄ λˆ„κ΅¬μΈμ§€ 배열에 λ‹΄μ•„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œ 쑰건

  • μ‹œν—˜μ€ μ΅œλŒ€ 10,000 문제둜 κ΅¬μ„±λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.
  • 문제의 정닡은 1, 2, 3, 4, 5쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.
  • κ°€μž₯ 높은 점수λ₯Ό 받은 μ‚¬λžŒμ΄ μ—¬λŸΏμΌ 경우, returnν•˜λŠ” 값을 μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•΄μ£Όμ„Έμš”.

ν•΄κ²°

  1. 1번 λΆ€ν„° 3번 μˆ˜ν¬μžλ“€μ΄ 문제λ₯Ό μ°λŠ” νŒ¨ν„΄μ„ λ°°μ—΄λ‘œ λ§Œλ“€μ–΄λ‘”λ‹€. → p1, p2, p3
  2. ansλΌλŠ” 배열을 λ§Œλ“€μ–΄μ„œ μˆ˜ν¬μžλ“€μ˜ 각 μ •λ‹΅ 개수λ₯Ό μ €μž₯ν•œλ‹€.
    → i번 μˆ˜ν¬μžκ°€ 정닡을 λ§žμ·„λ‹€λ©΄ ans[i]의 값을 μ¦κ°€μ‹œν‚¨λ‹€.
  3. μ •λ‹΅κΈΈμ΄λ§ŒνΌ λ°˜λ³΅λ¬Έμ„ λŒλ©΄μ„œ μˆ˜ν¬μžλ“€μ΄ μ„ νƒν•œ μ •λ‹΅κ³Ό λΉ„κ΅ν•˜μ—¬ 맞으면 ans[수포자 번호]의 값을 μ¦κ°€μ‹œν‚¨λ‹€.
  4. μ •λ‹΅ 길이만큼 λ°˜λ³΅λ¬Έμ„ κ±°μΉ˜κ³ λ‚˜λ©΄ μˆ˜ν¬μžλ“€μ΄ 맞힌 λ‹΅μ˜ κ°œμˆ˜κ°€ κ°€μž₯ 큰 값을 Maxλ³€μˆ˜μ— μ €μž₯ν•œλ‹€.
  5. ans배열을 μˆœνšŒν•˜λ©° Maxκ°’κ³Ό 같은 값을 κ°€μ§„ μΈλ±μŠ€κ°€ μ‘΄μž¬ν•œλ‹€λ©΄ answer배열에 μΆ”κ°€ν•œλ‹€.

μ΄λ ‡κ²Œ λͺ¨λ“  정닡에 λŒ€ν•΄μ„œ 각각 λΉ„κ΅ν•˜κ³ , κ°€μž₯ 큰 값을 κ³¨λΌμ„œ answer배열에 μΆ”κ°€ν•˜λ©΄ κ°€μž₯ λ§Žμ€ 문제λ₯Ό 맞힌 μ‚¬λžŒμ΄ λˆ„κ΅¬μΈμ§€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ €μž₯λ©λ‹ˆλ‹€.

 μ½”λ“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int p1[] = { 12345}, p2[] = { 21232425}, p3[] = { 3311224455 };
int ans[5];
vector<int> solution(vector<int> answers) {
    vector<int> answer;
    int idx = 0, Max = 0;
    for (int i = 0; i < answers.size(); i++){
        if (p1[idx % 5== answers[i]) ans[1]++;
        if (p2[idx % 8== answers[i]) ans[2]++;
        if (p3[idx % 10== answers[i]) ans[3]++;
        idx++;
    }
    Max = max(ans[1], ans[2]);
    Max = max(Max, ans[3]);
    for (int i = 1; i <= 3; i++) {
        if (Max == ans[i]) answer.push_back(i);
    }
    return answer;
}
cs