https://school.programmers.co.kr/learn/courses/30/lessons/181916?language=cpp
문제 설명
1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.
네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.
세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻습니다.
주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.
네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.
네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
알고리즘
1. 주사위 백터와 주사위 빈도 수를 저장하는 백터를 각각 생성해준다.
2. 주사위의 빈도수를 저장해준다.
3. count 백터가 원소 4만 있다면 전부 같은 수만 있다는 의미이다.
4. count 백터의 첫 번째 원소가 3이라면 2개의 경우의 수가 존재하게 된다.
5. count 벡터의 첫 번째 원소가 3이면
- 케이스 1: 나머지 숫자가 다른 하나의 숫자일 때 → 이 숫자를 찾아서 (10 * p + q)²를 계산.
- 케이스 2: 두 쌍이 존재할 때 (p, q가 다르고 각각 2번씩 나오는 경우) → 이 경우 (p + q) * |p - q|를 계산.
- 이건 count에서 숫자의 등장 횟수를 보면 쉽게 알 수 있음.
6. count 벡터에 2가 2개 있는 경우
- 두 쌍이니까 해당 숫자들을 찾아서 (p + q) * |p - q|를 계산.
7. count 벡터에 2가 1개만 있는 경우
- 특정 숫자 p가 2번 나왔고, 나머지 두 숫자 q와 r은 각각 한 번씩 나왔다는 뜻임.
- 따라서 q * r을 계산.
8. count 벡터가 전부 1이라면
- 전부 다른 숫자니까 가장 작은 숫자만 반환하면 됨.
코드
#include <vector>
#include <algorithm>
using namespace std;
int solution(int a, int b, int c, int d) {
vector<int> dice = {a, b, c, d};
vector<int> count(7, 0);
for (int num : dice) {
count[num]++;
}
for (int i = 1; i <= 6; i++) {
if (count[i] == 4) {
return 1111 * i;
}
if (count[i] == 3) {
int q = find(count.begin(), count.end(), 1) - count.begin();
return (10 * i + q) * (10 * i + q);
}
}
vector<int> pairs;
for (int i = 1; i <= 6; i++) {
if (count[i] == 2) pairs.push_back(i);
}
if (pairs.size() == 2) {
return (pairs[0] + pairs[1]) * abs(pairs[0] - pairs[1]);
}
if (pairs.size() == 1) {
int p = pairs[0];
vector<int> others;
for (int i = 1; i <= 6; i++) {
if (count[i] == 1) others.push_back(i);
}
return others[0] * others[1];
}
return *min_element(dice.begin(), dice.end());
}
#이렇게 푼사람도 있는데 진짜 신박해서 리뷰함.
vector<vector<int>> nums(5);
nums[table[0]].emplace_back(1);
nums[table[1]].emplace_back(2);
nums[table[2]].emplace_back(3);
nums[table[3]].emplace_back(4);
nums[table[4]].emplace_back(5);
nums[table[5]].emplace_back(6);
- nums: 빈도별로 주사위 숫자를 분류하는 2차원 벡터.
- 예: table[0] == 2라면, 숫자 1이 빈도 2로 등장하므로 nums[2]에 1을 추가.
- nums[빈도]에 해당 숫자들이 저장된다. 이게 진짜 신박했음.
예시:
- 주사위 숫자가 6, 3, 3, 6인 경우:
- table = [0, 0, 2, 0, 0, 2]
- nums = [[], [], [3, 6], [], []]
- nums[2]에는 빈도가 2인 숫자들이 저장됨.
'코딩테스트 연습' 카테고리의 다른 글
SW Expert Academy - 1204. 최빈수 구하기 D2 (0) | 2025.01.09 |
---|---|
SW Expert Academy - 22979. 문자열 옮기기 D3 (0) | 2025.01.08 |
프로그래머스 주식가격 (3) | 2024.10.18 |
프로그래머스 프로 (1) | 2024.10.18 |
프로그래머스 올바른 괄호 (0) | 2024.10.17 |