백준(알고리즘)

백준 11723 집합

2021. 1. 16. 20:12
반응형

www.acmicpc.net/problem/11723

 

11723번: 집합

첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.

www.acmicpc.net

#include <iostream>
#include <string>

using namespace std;

int main()
{	cin.tie(NULL);
	ios::sync_with_stdio(false);
	int n;
	cin >> n;

	string input;


	int tmp;

	int bit = 0;

	for (int i = 0; i < n; i++)//숫자만큼 반복
	{
		input.clear();//초기화

		cin >> input;

		if (input[1] == 'd')//add
		{
			cin >> tmp;
			bit |= (1 << tmp); //<<오른쪽으로 이동 >>왼쪽으로이동 |=or = 더하기 ;

		}

		else if (input[1] == 'e')//remove
		{
			cin >> tmp;
			bit &= ~(1 << tmp); //~not이 없었더라면 그부분을 제외한 나머지가 0이된다 따라서 반전을 시키는게 맞다

		}

		else if (input[1] == 'h')//check
		{
			cin >> tmp;
			if (bit & (1 << tmp)) //tmp만큼 움직인쪽에 있는게 켜져있고 bit에서도 그 위치가 켜져있을때
			{
				cout<<1<<'\n';
			}
			else cout<<0<<'\n';

		}

		else if (input[1] == 'o')//toglle 
		{
			// ^가 토글이라는데 
			cin >> tmp;
			bit ^= (1 << tmp);

		}

		else if (input[1] == 'l') //all
		{
			bit = (1 << 22) - 1; //  10000000000000000000 -1 (1이21개-1) = 11111111111111111111 (1이20개) 근데 입력이 1이면 정확히는 1<<tmp할때 (tmp=1) 10이 되는게 아닌가?

		}

		else //empty
		{
			bit = 0;
		}




	}

}

 

집합으로 하면 시간초과가 날 뿐더러 출력이 까다롭지 않으니

비트마스크 쉬프트 연산자를 활용하여 

tmp이 1일경우

(1<<tmp) 001이 010으로 변하는 점을 이용하여 어차피 상수는 이상할지 모르더라도 쉬프트를 사용한다면

앞으로도 bit|=(1<<tmp)를 하더라도 010을 찾아내주기 때문에 사용된듯 싶다

 

다만 풀면서 의아했던부분은

가장 작은 입력값인 1을 넣었을때 (1<<tmp) = 2이므로 10부터 입력이 된다

 

따라서 all을 사용하면 1..2..3..4....20 으로 초기화를 한다고 하였는데 

단순히 all이 1,2로 초기화를 한다고 가정하여도 우리가 원하는 그림은 00011 (0은 이해를 돕기위함)이므로

(1<<2)-1이지 않는가?

그럼 20까지므로 (1<<20)-1 이 사실상 우리가 원하는 그림일텐데

...

쓰다보니 이해가 됬다

맨 1에서 쉬프트를 하다보니 맨 앞의 1은 생략하고 10이 1이 되니 20까지 원하는건 1<<21로 하는게 맞다 (물론 21보다 커도 무관하다)

 

출처 : https://wogud6792.tistory.com/63   자습용으로 가져왔습니다! 

 

그 외에 string으로 입력을 받고 ==를 사용했는데 안되길래 input[1]의 문자가 다 다른점을 활용하여 [1]에 있는 값으로 if문을 만들었다

 

cin.tie(NULL);

ios::sync_with_stdio(false);

 

이 두줄이 없었다면 시간초과가 났겠지..

반응형

'백준(알고리즘)' 카테고리의 다른 글

백준 1613 역사  (0) 2021.01.17
백준 14889 스타트와 링크 (비트마스크)  (0) 2021.01.17
백준 2217 로프  (0) 2021.01.09
백준 11404 플로이드  (0) 2021.01.09
백준 18353 병사 배치하기  (0) 2021.01.03
'백준(알고리즘)' 카테고리의 다른 글
  • 백준 1613 역사
  • 백준 14889 스타트와 링크 (비트마스크)
  • 백준 2217 로프
  • 백준 11404 플로이드
빡상이
빡상이
게임 및 개발 관련 일지 작성하는 블로그
빡상이
끄적끄적
빡상이
반응형
  • 분류 전체보기
    • FrontEnd
      • Vue3
      • Nuxt
    • BackEnd
      • 로스트아크 Work
    • 백준(알고리즘)
    • Unreal Engine
    • 아크라시아 세카이
    • C++
    • 웹 개발 꿀팁
    • C#
    • Linux
      • 명령어
    • DB
      • SQL
      • Tibero
전체
오늘
어제

최근 댓글

최근 글

hELLO · Designed By 정상우.
빡상이
백준 11723 집합
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.