Hyemi Lee

Hyemi Lee

주니어 개발자의 삽질과 기록

Algorithm, 비트연산자, 쉬프트 연산자, 카카오-후보키

비트 연산자

  • 정수형 기본형 데이터 타입의 각 비트를 개별적으로 조작
  • 양쪽 피연산자의 대응되는 각 비트별로 부울 연산을 한다

비트 연산자 종류 및 예제

  • & : AND, 양쪽 모두 1일때만 1
    • ex) 4&5 -> 4 (4=100, 5=101)
  • __ __ : OR, 양쪽 모두 0일 때만 0
    • ex) 4 5 -> 5
  • ^ : XOR, 양쪽 비트가 서로 다를때1, 같으면 0
    • ex) 4^5 -> 1
  • ~ : NOT, 모든 비트값을 반대로 만든다. -ex) ~5 -> -6 (101 -> 11111111111111111111111111111010)

쉬프트 연산자

  • 자바의 기본정수 타입은 반드시 부호(sign)가 있는 정수 값을 가짐
  • 부호는 제일 왼쪽 한 비트에 표시, 이 비트를 MSB(Most Significant Bit: 최상위 비트) 양수:0, 음수:1
  • 비트 단위 연산 수행, 기본 정수 타입인 byte, short, char, int, long에만 사용 할 수 있다.

쉬프트 연산자 종류

  • « : 왼편의 피연산자 비트 값을 오른편에 지정한 수만큼 왼쪽으로 이동, 오른쪽 남는 비트는 0으로 채운다
  • » : 왼편의 피연산자 비트 값을 오른편에 지정한 수만큼 오른쪽으로 이동, 비어있는 왼쪽 비트는 부호와 같은 값으로 채운다.
  • »> : unsigned 우측 쉬프트 연산자는 왼편의 남는 비트를 부호와는 무관하게 0으로 채운다.

후보키

package org.programmers;
import java.util.ArrayList;
import java.util.HashSet;
public class kakao_42890 {
	public static int solution(String[][] relation) {
		ArrayList<Integer> candidateKey = new ArrayList<>();
		int rowLen = relation.length;
		int colLen = relation[0].length;
		for (int set = 1; set < (1 << colLen); set++) {
			// 최소성 검사
			if (!isMinimal(set, candidateKey))
				continue;
			// 유일성 검사
			if (isUnique(set, rowLen, colLen, candidateKey, relation)) {
				System.out.println(Integer.toBinaryString(set));
				candidateKey.add(set);
			}
		}
		return candidateKey.size();
	}
	private static boolean isUnique(int set, int rowLen, int colLen, ArrayList<Integer> candidateKey,
			String[][] relation) {
		HashSet<String> map = new HashSet<>();
		for (int row = 0; row < rowLen; ++row) {
			String dataByKeySet = "";
			// 한 row당 해당 컬럼의 값을 뽑아 dataByKeySet을 만들어준다.
			// ex. set=6 이면 0110, 이므로 th값이 1, 2일때 가능하므로,
			// relation[0][1]=ryan, relation[0][2]=music ==> dataByKeySet=ryanmusic이 될수있다.
			for(int th=0; th<colLen; ++th) {
				System.out.println("set="+set + " th="+th+ " set & (1<<th)="+ (set & (1<<th)));
				if((set & (1<<th)) != 0) {
					System.out.println("relation["+row+"]["+th+"]="+ relation[row][th]);
					dataByKeySet += relation[row][th];
				}
			}
			System.out.println("dataByKeySet="+dataByKeySet);
			// 모든 경우가 독립적인지 확인한다.
			if(map.contains(dataByKeySet)) return false;
			else map.add(dataByKeySet);
		}
		return true;
	}
	private static boolean isMinimal(int set, ArrayList<Integer> candidateKey) {
		// 이미 후보키로 선정된 조합이 들어있는 경우에 속성이 추가되면
		// 그 속성을 없앴을때 유일성을 만족하므로, 최소성을 만족하지 않는다.
		// 따라서 , 이미 후보키로 선정된 조합에 set이 포함되면 안된다!!
		for (int key : candidateKey) {
			if ((key & set) == key)
				return false;
		}
		return true;
	}
}

집합-boj

import java.util.Scanner;
public class test11723 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		 int t = scanner.nextInt();
		 int bitSet = 0;
		 StringBuilder answer = new StringBuilder();
		 for (int i=0; i<t; i++) {
		 String command = scanner.next();
		 if ("add".equals(command)) {
		 int n = scanner.nextInt();
		 bitSet = bitSet | (1 << n);
		 } else if ("remove".equals(command)) {
		 int n = scanner.nextInt();
		 bitSet = bitSet & ~(1 << n);
		 } else if ("check".equals(command)) {
		 int n = scanner.nextInt();
		 int result = (bitSet & (1 << n));
		 if (result > 0 ) {
		 answer.append("1\n");
		 System.out.println(1);
		 } else if (result == 0) {
		 answer.append("0\n");
		 System.out.println(0);
		 }
		 } else if ("toggle".equals(command)) {
		 int n = scanner.nextInt();
		 bitSet = bitSet ^ (1<<n);
		 } else if ("all".equals(command)) {
		 bitSet = (1 << 21) - 1;
		 bitSet = bitSet & ~(1);
		 } else if ("empty".equals(command)) {
		 bitSet = 0;
		 }
		 }
		 System.out.println(answer);
		
	}
}

참고

Share on

Twitter Facebook LinkedIn

You may also enjoy

Redis Stream

2021年04月28日

Stream Stream은 로그 데이터를 처리하게위해 5.0에서 새로 도입된 데이터 타입입니다. 대량의 데이터가 연속적으로 발생할때 처리하기 위해 등장했습니다. 기존 데이터를 수정하지 않고 오직 추가로 발생합니다. 이런 종류의 데이터를 stream or log데이터...

Study, Object, chapter2&3 presentation

2021年04月20日

chapter03. 역할, 책임, 협력 객체지향 설계란, 올바른 객체에게 올바른 책임을 할당하면서 낮은 결합도와 높은 응집도를 가진 구조를 창조하는 활동이다.

Spring, chatting 프로그램 만들기, Reactive란?

2020年06月16日

Reactive 막힘없이 흘러다니는 data(event)를 통해 사용자에게 자연스러운 응답을 주고 규모 탄력적으로 리소스를 사용하며 실패에 있어서 유연하게 대처한다 모든 지점에서 블럭 되지 않게 하자 oop와 같은 패러다임 모든 것을 비동기적인 data의 strea...