일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Baekjoon
- 여름 인턴십
- 카카오 여름 인턴
- Dev-matching
- 카카오 전환
- MapStruct
- BOJ
- 카카오
- 1등당첨기원
- 구현
- 삼성A형
- 2020 카카오 인턴
- 12100번
- 백준
- 카카오 인턴
- 카카오 서류
- 삼성전자 3급
- Lombok-MapStruct-binding
- 카카오 면접
- 채용연계형
- 2020
- 알고리즘
- C++
- Summer Intern
- 프로그래머스
- 개발자
- 백트래킹
- nextcamp
- 14890번
- 2020 kakao
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Baekjoon
- 여름 인턴십
- 카카오 여름 인턴
- Dev-matching
- 카카오 전환
- MapStruct
- BOJ
- 카카오
- 1등당첨기원
- 구현
- 삼성A형
- 2020 카카오 인턴
- 12100번
- 백준
- 카카오 인턴
- 카카오 서류
- 삼성전자 3급
- Lombok-MapStruct-binding
- 카카오 면접
- 채용연계형
- 2020
- 알고리즘
- C++
- Summer Intern
- 프로그래머스
- 개발자
- 백트래킹
- nextcamp
- 14890번
- 2020 kakao
- Today
- Total
슬기로운개발생활
[백준] 2629번 양팔저울 C++ 본문
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 128 MB | 6382 | 1705 | 1181 | 26.539% |
문제
양팔 저울과 몇 개의 추가 주어졌을 때, 이를 이용하여 입력으로 주어진 구슬의 무게를 확인할 수 있는지를 결정하려고 한다.
무게가 각각 1g과 4g인 두 개의 추가 있을 경우, 주어진 구슬과 1g 추 하나를 양팔 저울의 양쪽에 각각 올려놓아 수평을 이루면 구슬의 무게는 1g이다. 또 다른 구슬이 4g인지를 확인하려면 1g 추 대신 4g 추를 올려놓으면 된다.
구슬이 3g인 경우 아래 <그림 1>과 같이 구슬과 추를 올려놓으면 양팔 저울이 수평을 이루게 된다. 따라서 각각 1g과 4g인 추가 하나씩 있을 경우 주어진 구슬이 3g인지도 확인해 볼 수 있다.
<그림 2>와 같은 방법을 사용하면 구슬이 5g인지도 확인할 수 있다. 구슬이 2g이면 주어진 추를 가지고는 확인할 수 없다.
추들의 무게와 확인할 구슬들의 무게가 입력되었을 때, 주어진 추만을 사용하여 구슬의 무게를 확인 할 수 있는지를 결정하는 프로그램을 작성하시오.
입력
첫째 줄에는 추의 개수가 자연수로 주어진다. 추의 개수는 30 이하이다. 둘째 줄에는 추의 무게들이 자연수로 가벼운 것부터 차례로 주어진다. 같은 무게의 추가 여러 개 있을 수도 있다. 추의 무게는 500g이하이며, 입력되는 무게들 사이에는 빈칸이 하나씩 있 다. 세 번째 줄에는 무게를 확인하고자 하는 구슬들의 개수가 주어진다. 확인할 구슬의 개수는 7이하이다. 네 번째 줄에는 확인하고자 하는 구슬들의 무게가 자연수로 주어지며, 입력되는 무게들 사이에는 빈 칸이 하나씩 있다. 확인하고자 하는 구슬의 무게는 40,000보다 작거나 같은 자연수이다.
출력
주어진 각 구슬의 무게에 대하여 확인이 가능하면 Y, 아니면 N 을 차례로 출력한다. 출력은 한 개의 줄로 이루어지며, 각 구슬에 대한 답 사이에는 빈칸을 하나씩 둔다.
예제 입력 1
2 1 4 2 3 2
예제 출력 1
Y N
백트래킹 관련 문제를 찾다가 이 문제를 풀게 됐다.
하지만 도저히 백트래킹으로 풀 방법이 생각나지 않아서 내 방식대로 풀었던 문제이다.
아이디어를 떠올리기까지 시간이 조금 걸린 문제같다.
● 풀이방법
1. 주어진 추들을 조합하여 측정이 가능한 모든 구슬의 무게를 측정한다.
2. 측정한 무게들은 정렬할 필요는 없지만, 중복을 방지하기 위해 unordered_set 을 사용한다.
2-1. 첫번째 추는 set 배열에 그대로 넣는다.
2-2. 두번째 추부터 set에 있는 모든 원소와 (+, -)연산을 각각 수행한 후 set배열에 넣고 마지막에 자기 자신의 무게를 넣는다.
3. 주어진 구슬의 무게들이 각각 set에 있는지 find 수행 후 있으면 'Y', 없다면 'N'을 출력한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <iostream> #include <vector> #include <unordered_set> using namespace std; int N, M; vector<int> balls(30, 0); unordered_set<int> possible_weights; int main() { cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false); cin >> N; int weight; for (register int i = 0; i < N; i++) cin >> balls[i]; for (register int i = 0; i < N; i++) { if (i != 0) { vector<int> copy; for (auto iter = possible_weights.begin(); iter != possible_weights.end(); iter++) copy.push_back(*iter); for (register int j = 0; j < copy.size(); j++) { int val1 = balls[i] - copy[j]; int val2 = balls[i] + copy[j]; if (val1 != 0) possible_weights.insert(abs(val1)); if (val2 != 0) possible_weights.insert(abs(val2)); } } possible_weights.insert(weight); } cin >> M; for (register int i = 0; i < M; i++) { cin >> weight; if (possible_weights.find(weight) != possible_weights.end()) cout << "Y "; else cout << "N "; } return 0; } | cs |
혹시나 풀이 중 틀린 부분이나 비효율적이라고 생각되는 부분은 지적해주시면 감사하겠습니다!
'Algorithm' 카테고리의 다른 글
[백준] 14890번 경사로 C++ (0) | 2020.05.29 |
---|---|
[백준] 12100번 2048 (Easy) C++ (0) | 2020.05.20 |
[백준] 14499번 주사위 굴리기 (0) | 2020.05.17 |
[백준] 13460번 구슬탈출2 C++ (0) | 2020.05.06 |
[백준] 1759번 암호만들기 C++ (0) | 2020.04.28 |