문제 링크

요약

  • 꼼꼼하기만 하면 푸는 문제.

최종

  • 별로 어려운 문제는 아니다. 그냥 set에 저장해두고 처리하면 된다.
    • 학생수가 30명 이하라 bms 사용했다. 이정도는 최적화는 누구나 할듯
#include <string>
#include <vector>
 
using namespace std;
 
#define bms unsigned int
 
int solution(int n, vector<int> lost, vector<int> reserve) {
	bms lost_bms = 0, reserve_bms = 0, both;
	int cnt = 0;
 
	for (auto l : lost) {
		lost_bms |= 1 << (l - 1);
	}
 
	for (auto r : reserve) {
		reserve_bms |= 1 << (r - 1);
	}
 
	// Reserve but lost
	both = lost_bms & reserve_bms;
	lost_bms ^= both;
	reserve_bms ^= both;
 
	for (int i = 0; i < n; i++) {
		if ((lost_bms >> i) & 0x1) {
			// Help me
			if ((i > 0) && ((reserve_bms >> (i - 1)) & 0x1)) {
				// Before
				reserve_bms ^= 1 << (i - 1);
				cnt++;
			} else if ((i + 1 < n) && ((reserve_bms >> (i + 1)) & 0x1)) {
				// After
				reserve_bms ^= 1 << (i + 1);
				cnt++;
			}
		} else {
			cnt++;
		}
	}
 
	return cnt;
}
  • 하나 실수해서 삽질한건:
    • both 변수 사용하기가 아까워 lost_bmslost_bms & reserve_bms 를 XOR한 후, 뒤이어 reserve_bms 에도 XOR을 하였다. 당연히 그럼 에러가 난다. 뒤이은 statement 에서는 lost_bms 가 이미 바뀌어있기 때문.