https://school.programmers.co.kr/learn/courses/30/lessons/77484
구현문제이다. 굳이 알고리즘적이 내용을 부여하자면 탐색문제이다. 그것도 아주 간단한 순차탐색.
몇개의 숫자가 지워져 있기 때문에, 최저 순위는 지워지지 않은 나머지 숫자중에서 정답과 일치하는 숫자의 개수로 따지면 될 것이고, 최고 순위는 여기에 0의 개수를 더해주면 될 것이다.
간단한 상황을 통해 이해해보자. 만약 0이 3개이고, 같은 숫자가 2개, 다른 숫자 1개라면, 최저 5등은 보장한다. 2개가 같으면 5등이고, 0이 무엇이 되던, 최소 2개는 같다는 것이 보장되기 때문이다. 그리고 이는 7 - (일치하는 숫자개수 = 2) = 5이기도 하다. 최고 등수는 0이 모두 정답과 같은 숫자들인 경우이다. 어떤 숫자인지는 경우가 많겠지만, 우리는 그 경우가 중요한게 아니라, 몇개가 일치하는지를 알고 싶기 때문에, 0 세개가 모두 같은 경우 최고 등수인 2등을 얻을 것이다. 다른숫자 1개가 껴있기 때문에 절대 1등을 할 수는 없다. 그리고 최고 등수 2등은 7 - (일치하는 숫자 개수(2) + 0의 개수(3)) = 2이기도 하다. 이를 코드에 그대로 구현하면... 틀린다. 왜 틀린지는 다음 오류 상황을 보면 이해할 수 있을 것이다.
다음은 필자가 겪은 몇가지 오류이다. 이거 말고는 딱히 어렵거나, 캐치하기 힘든 것은 없다고 판단한다. 단, 다음 설명들은 필자의 코드와, 의도를 어느정도 이해했다는 것을 전제로 한다.
- 같은 것이 아예 없다면, 최저 등수가 7등이 된다. 7 - (일치하는 숫자 개수 = 0) = 7이기 때문이다. 7등은 존재하는 등수가 아니기 때문에, 이런경우는 일치하는 숫자 개수가 0일때는 1로 계산하도록 한다. (예제 2에서 걸릴 것)
- 0이 들어있지 않고, 동시에 같은 숫자도 아예 없다면, 최저, 최고등수 모두 7, 7이 될 것이다. 이 경우 역시 두개의 합이 0일때 1로 처리해줘야 한다. (테스트케이스 14에서 걸림)
#include <bits/stdc++.h>
using namespace std;
int same_cnt(const vector<int>& lotto, const vector<int> win) {
int cnt = 0;
for(int i = 0; i < lotto.size(); i++) {
if (lotto[i] == 0) continue;
for(int j = 0; j < win.size(); j++) {
if (lotto[i] == win[j]) cnt++;
}
}
return cnt;
}
int zero_cnt(const vector<int>& lotto) {
int cnt = 0;
for(int i = 0; i < lotto.size(); i++) {
if (lotto[i] == 0) cnt++;
}
return cnt;
}
vector<int> solution(vector<int> lottos, vector<int> win_nums) {
vector<int> answer;
int same = same_cnt(lottos, win_nums);
int zero = zero_cnt(lottos);
answer.push_back(7 - (same + zero ? same + zero : 1)); // 모두 다른 경우를 위한 조건식
answer.push_back(7 - (same ? same : 1)); // 같은것이 아예 없을 때의 조건식
return answer;
}
'coding_test > programmers' 카테고리의 다른 글
lv2 / 3 x n 타일링 / C++ (0) | 2022.10.06 |
---|---|
lv2 / n^2 배열 자르기 / C++ (0) | 2022.09.19 |
lv2 / 피로도 / C++ (0) | 2022.09.13 |
lv1 / 성격 유형 검사 / 카카오 / C++ (2) | 2022.09.13 |
lv2 / 양궁대회 / 카카오 / C++ (0) | 2022.09.08 |