728x90
와.. 이름만 보고 풀기로 마음먹었는데
예상외로 비트연산을 이용해야하는 문제라 애 좀 먹었다.. (다 까먹어서.. 멍충)
그냥 배열로 순회하면서 구현했을때는 시간초과가 나서, 기억 저편에 있던 비트연산을 다시 공부하며 풀었다.
챗지피티한테 이것저것 물어보면서 이해했는데 이 똥멍청이가 자꾸 자기가 한말을 번복해서 이해하는데 엄청 오래 걸렸다.. (사실 내가 똥멍청이)
아무튼.. 코드를 작성하며 이해가 잘 안간 비트 연산들을 필기해놓은 것들을 같이 첨부한다. 부디 나처럼 헤매는 분들이 있다면 도움이 되길 바라며..
아 혹시 몰라서 배열로 진행한 코드도 같이 첨부하겠다.
<비트연산 이용 코드> - 정답
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
//0~20까지의 기차 좌석
vector<int> train(N+1, 0);
for(int i=0; i<M; i++) {
int c, j, k; cin >> c;
switch (c)
{
case 1:
cin >> j >> k;
//k번째 승객 탑승
train[j] |= (1 << k);
break;
case 2:
cin >> j >> k;
//&연산자로 k번째 승객 하차, 나머지 좌석 유지
train[j] &= ~(1 << k);
break;
case 3:
cin >> j;
//승객 전체 left shift, 가장 오른쪽(1번째) 0
train[j] = train[j] << 1;
// 21번째 좌석이 생길수도 있으므로, 좌석 20개 유지
train[j] = train[j] & ((1 << 21) - 1);
break;
case 4:
cin >> j;
//1번째 승객 하차
train[j] = train[j] & ~1;
//승객 전체 right shift
train[j] = train[j] >> 1;
break;
default:
break;
}
}
//set으로 중복 제거
set<int> s;
for(int i=1; i<=N; i++) {
s.insert(train[i]);
}
cout << s.size() << "\n";
return 0;
}
<배열 이용 코드>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
vector<vector<int> > train(N, vector<int>(21,0));
for(int i=0; i<M; i++) {
int c, j, k; cin >> c;
switch (c)
{
case 1:
cin >> j >> k;
if(j<-0|| j>=N || k<0 || k>=21) continue;
if(train[j][k]==0) train[j][k] = 1;
break;
case 2:
cin >> j >> k;
if(j<-0|| j>=N || k<0 || k>=21) continue;
if(train[j][k]==1) train[j][k] = 0;
break;
case 3:
cin >> j;
for(int p=19; p>=0; p--) {
train[j][p+1] = train[j][p];
}
train[j][0] = 0;
break;
case 4:
cin >> j;
for(int p=1; p<21; p++) {
train[j][p-1] = train[j][p];
}
train[j][20] = 0;
break;
default:
break;
}
}
vector<vector<int> > unique_train;
for(const vector<int>& v : train) {
if(find(unique_train.begin(), unique_train.end(), v)== unique_train.end())
unique_train.push_back(v);
}
cout << unique_train.size() << "\n";
return 0;
}
728x90
'Algorithm > 백준과 프로그래머스' 카테고리의 다른 글
[C++] 프로그래머스 LV1. 체육복 (1) | 2024.01.05 |
---|---|
[C++] 9251. LCS (1) | 2023.11.29 |
[C++] 1991. 트리 순회 (0) | 2023.11.28 |
[C++] 14940. 쉬운 최단거리 (2) | 2023.11.27 |
[C++] 21317.징검다리 건너기 (1) | 2023.11.24 |