사용 알고리즘: Hash Map
- 반복문을 통해 약의 효능(key)과 이름(value)을 med(hash map)에 저장한다.
- 각 줄의 증상의 개수만큼 입력 받으면서 med에 등록된 효능이라면 배열에 약의 이름을 저장해준다.
- 저장되지 않은 효능이 나오면 flag에 false값을 저장한다.
- flag가 참이면 배열에 저장된 약의 이름들을 형식에 맞게 출력한다.
- flag가 거짓이면 YOU DIED를 출력한다.
3번 과정에서 저장되지 않은 효능이 나오면 flag를 수정하고 더이상 반복문을 돌리지 않는 것이 바람직하겠지만, 아래 코드에서 break만 추가하면 아직 입력되지 못한 값들이 다음으로 넘어가면서 프로그램이 꼬이게 된다.
그래서 지금 코드에서는 그냥 끝까지 돌려주는 로직으로 작성했지만 만약 범위가 더 커지면 시간 초과가 날 듯. 아무튼 비효율적임. 다음엔 이런 부분까지 생각하면서 코드를 짜보자!
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <cmath>
#define ll long long
using namespace std;
map<int, int> med;
int m[100];
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, me, mn, r, l, s;
bool flag;
cin >> n; // 약의 종류
for (int i = 0; i < n; i++) {
cin >> me >> mn; // 약의 효능, 약의 이름
med[me] = mn; // hash map
}
cin >> r; // 증상의 개수
for (int i = 0; i < r; i++) {
cin >> l; // 증상의 개수
flag = 1; // 초기화
for (int k = 0; k < l; k++) {
cin >> s;
if (med.find(s) == med.end()) { flag = 0; } // 없음 died...
else { m[k] = med[s]; }
}
if (flag) { // 모두 치료 가능
for (int z = 0; z < l; z++) { cout << m[z] << " "; }
cout << '\n';
}
else { cout << "YOU DIED\n"; }
}
return 0;
}
수많은 맞왜틀을 만들었던 코드.
if (med[s] == NULL)
약의 효능과 이름에는 0도 들어가는데 위의 조건문을 사용하면 0을 NULL 처리해버리고 있었음... 그래서 문제 풀이 1번의 코드 처럼 med.find() == med.end()를 써서 처리했다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <cmath>
#define ll long long
using namespace std;
map<int, int> med;
int m[100];
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, me, mn, r, l, s, cnt;
bool flag;
cin >> n; // 약의 종류
for (int i = 0; i < n; i++) {
cin >> me >> mn; // 약의 효능, 약의 이름
med[me] = mn; // hash map
}
cin >> r; // 증상의 개수
for (int i = 0; i < r; i++) {
cin >> l; // 증상의 개수
flag = 1;// 초기화
for (int k = 0; k < l; k++) {
cin >> s;
if (med[s] == NULL) { flag = 0; }
else { m[k] = med[s];}
}
if (flag) { // 모두 치료 가능
for (int z = 0; z < l; z++) { cout << m[z] << " "; }
cout << '\n';
}
else { cout << "YOU DIED\n"; }
}
return 0;
}
맞왜틀을 5번 하고 스터디분들께 도움을 요청했었는데 한 분이 map.contains(key)
함수를 알려주셨다. 그런데 해당 함수를 사용하려니까 없다고 나와서 당황함. 찾아보니 c++20부터 지원되는 함수라고 한다. 이렇게 각 버전 별로 조금씩 차이가 있길래 어떤 버전을 사용하는 것이 좋을까 싶어졌음.
결론은 잘 모르겠고(ㅎㅎ), 삼성 코테에서는 c++11을 사용한다고 합니다. 근데 아직 초보를 잘 모르겠음. 공부하면서 이렇게 하나씩 알게 되겠지 ^^
흑흑 코드 하나 차이로 틀렸습니다가 쌓이면 마음이 아프다