
1. 문제설명

2. 접근 방법 & 정답코드
`GENOTYPE`을 이진수로 변환한 값의 `각 자릿수`가 `보유한 형질`을 나타내므로
비트연산을 해 주어야 하는 문제라는 걸 알 수 있다 !
SELECT COUNT(*) AS COUNT
FROM ECOLI_DATA A
WHERE 1=1
AND (GENOTYPE & 2) != 2
AND ((GENOTYPE & 4) = 4 OR (GENOTYPE & 1) = 1)
이 문제는 WHERE절 작성하기가 조금 어려울 수 있기 때문에 하나씩 차근 차근 설명을 해 보겠다.
먼저 비트연산이란 걸 모르면 이해가 어려울 수 있기 때문에 비트연산 먼저 알아보자.
비트연산이란?
비트 연산은 숫자를 이진수 형태로 변환하여 각 비트를 기준으로 연산을 수행하는 방식이다. 프로그래밍과 데이터베이스에서 효율적으로 데이터 처리를 할 때 자주 사용됩니다. 주요 연산자는 `AND(&)`, `OR(|)`, `XOR(^)`, `NOT(~)`, 그리고 비트 이동 연산자(`>`,`<`) 라는 것도 있다. 비트 연산을 할 때는 십진수로 표현이 되어 있더라도 이진수로 바꾼 뒤 각 자릿수를 비교해야 한다.
비트연산 하는 법
예를 들어, 48&32를 비트 AND 연산 해 보자
숫자를 이진수로 변환 후 각 자릿수를 비교합니다.
비트 `AND(&) 연산`은 `양쪽 비트`가 `모두 1`일 때만 결과가 1이 됩니다.
48 (10진수) → 110000 (2진수)
32 (10진수) → 100000 (2진수)
48: 110000
& 32: 100000
----------------
100000
따라서 이 결과값은 100000으로 이진수를 십진수로 바꾸면 32이다.
위와 같은 방법으로 비트 연산을 해 주는 것인데,
이 문제에서 비트연산을 해 주어야 할 대상은 GENOTYPE컬럼과 1,2,3,4에 해당하는 각 숫자이다.
SELECT COUNT(*) AS COUNT
FROM ECOLI_DATA A
WHERE 1=1
AND (GENOTYPE & 2) != 2
AND ((GENOTYPE & 4) = 4 OR (GENOTYPE & 1) = 1)
비트 연산을 사용하여 특정 형질(비트 값)의 존재 여부를 확인해 주는 쿼리를 짜 준다.
WHERE 1 = 1
항상 참인 조건으로, 이후의 조건들을 추가로 연결하기 위한 구문이다.
실질적으로 의미가 없으며, 추가 조건이 동적으로 생성되는 상황에서 사용된다.
문제의 조건은
2번 형질이 없는 개체이며 이 중 1번이나 3번 형질을 보유한 것이라고 했다.
2번 형질이 없는 개체: GENOTYPE의 두 번째 비트가 꺼져 있어야 함.
1번 또는 3번 형질을 보유한 개체: GENOTYPE의 첫 번째 비트 또는 세 번째 비트가 켜져 있어야 함.
GENOYPE & 2를 한 값은 2가 아니어야 하고
그 중 GENOTYPE & 4를 한 값이 4이거나 GENOTYPE & 1을 한 값이 1이어야 한다.
왜 1번이나 3번 형질을 보유한 걸 찾으라고 했는데 비트 연산은 4랑 1을 하는지 의문이 생기는 분들이 있을 것이다.
이진수의 형식을 살펴 보자. 이 진수에서 첫 번째 비트가 나타내는 값은 1이고 세 번째 비트의 값은 4이기 때문이다.
각 자릿수 값 | 8 | 4 | 2 | 1 |
비트 순서 | 네번째 비트 | 세번째 비트 | 두번째 비트 | 첫번째 비트 |
1. (GENOTYPE & 2) != 2
이 연산은 GENOTYPE의 `두 번째 비트`가 꺼져 있는지 확인하는 절차이다.
비트 연산 &를 사용하여 GENOTYPE에서 `두 번째 비트(2진수 값: 2 = 0010)`가 켜져 있는지 확인한다.
결과가 2가 아니라면(즉, 0이라면), 두 번째 비트가 꺼져 있는 것이다.
2. ((GENOTYPE & 4) = 4 OR (GENOTYPE & 1) = 1)
GENOTYPE의 세 번째 비트(값 4, 2진수 0100) 또는 첫 번째 비트(값 1, 2진수 0001) 중 하나 이상이 켜져 있는지 확인
첫 번째 조건 (GENOTYPE & 4) = 4
세 번째 비트가 1인지 확인
두 번째 조건 (GENOTYPE & 1) = 1
첫 번째 비트가 1인지 확인
둘 중 하나라도 만족하면 참(OR 조건)
'Algorithm > SQL테스트' 카테고리의 다른 글
[프로그래머스] 👩🏻💻 (MySQL) SUM, MAX, MIN 문제 풀이 (49) | 2024.11.19 |
---|---|
[프로그래머스] 👩🏻💻 (MySQL) 특정 형질을 가지는 대장균 찾기 문제 풀이 (4) | 2024.11.19 |
[프로그래머스] 👩🏻💻 (MySQL) 조건에 맞는 개발자 찾기 문제풀이 (67) | 2024.11.18 |
[프로그래머스] 👩🏻💻 (Oracle/MySQL) 🐠 가장 큰 물고기 10마리 구하기 / 특정 물고기를 잡은 총 수 구하기 문제풀이 (49) | 2024.11.18 |
[프로그래머스] 👩🏻💻 (MySQL) 🐠 잔챙이 잡은 수 구하기 문제풀이 (56) | 2024.11.18 |

1. 문제설명

2. 접근 방법 & 정답코드
GENOTYPE
을 이진수로 변환한 값의 각 자릿수
가 보유한 형질
을 나타내므로
비트연산을 해 주어야 하는 문제라는 걸 알 수 있다 !
SELECT COUNT(*) AS COUNT FROM ECOLI_DATA A WHERE 1=1 AND (GENOTYPE & 2) != 2 AND ((GENOTYPE & 4) = 4 OR (GENOTYPE & 1) = 1)
이 문제는 WHERE절 작성하기가 조금 어려울 수 있기 때문에 하나씩 차근 차근 설명을 해 보겠다.
먼저 비트연산이란 걸 모르면 이해가 어려울 수 있기 때문에 비트연산 먼저 알아보자.
비트연산이란?
비트 연산은 숫자를 이진수 형태로 변환하여 각 비트를 기준으로 연산을 수행하는 방식이다. 프로그래밍과 데이터베이스에서 효율적으로 데이터 처리를 할 때 자주 사용됩니다. 주요 연산자는AND(&)
,OR(|)
,XOR(^)
,NOT(~)
, 그리고 비트 이동 연산자(>
,<
) 라는 것도 있다. 비트 연산을 할 때는 십진수로 표현이 되어 있더라도 이진수로 바꾼 뒤 각 자릿수를 비교해야 한다.
비트연산 하는 법
예를 들어, 48&32를 비트 AND 연산 해 보자
숫자를 이진수로 변환 후 각 자릿수를 비교합니다.
비트 AND(&) 연산
은 양쪽 비트
가 모두 1
일 때만 결과가 1이 됩니다.
48 (10진수) → 110000 (2진수)
32 (10진수) → 100000 (2진수)
48: 110000 & 32: 100000 ---------------- 100000
따라서 이 결과값은 100000으로 이진수를 십진수로 바꾸면 32이다.
위와 같은 방법으로 비트 연산을 해 주는 것인데,
이 문제에서 비트연산을 해 주어야 할 대상은 GENOTYPE컬럼과 1,2,3,4에 해당하는 각 숫자이다.
SELECT COUNT(*) AS COUNT FROM ECOLI_DATA A WHERE 1=1 AND (GENOTYPE & 2) != 2 AND ((GENOTYPE & 4) = 4 OR (GENOTYPE & 1) = 1)
비트 연산을 사용하여 특정 형질(비트 값)의 존재 여부를 확인해 주는 쿼리를 짜 준다.
WHERE 1 = 1
항상 참인 조건으로, 이후의 조건들을 추가로 연결하기 위한 구문이다.
실질적으로 의미가 없으며, 추가 조건이 동적으로 생성되는 상황에서 사용된다.
문제의 조건은
2번 형질이 없는 개체이며 이 중 1번이나 3번 형질을 보유한 것이라고 했다.
2번 형질이 없는 개체: GENOTYPE의 두 번째 비트가 꺼져 있어야 함.
1번 또는 3번 형질을 보유한 개체: GENOTYPE의 첫 번째 비트 또는 세 번째 비트가 켜져 있어야 함.
GENOYPE & 2를 한 값은 2가 아니어야 하고
그 중 GENOTYPE & 4를 한 값이 4이거나 GENOTYPE & 1을 한 값이 1이어야 한다.
왜 1번이나 3번 형질을 보유한 걸 찾으라고 했는데 비트 연산은 4랑 1을 하는지 의문이 생기는 분들이 있을 것이다.
이진수의 형식을 살펴 보자. 이 진수에서 첫 번째 비트가 나타내는 값은 1이고 세 번째 비트의 값은 4이기 때문이다.
각 자릿수 값 | 8 | 4 | 2 | 1 |
비트 순서 | 네번째 비트 | 세번째 비트 | 두번째 비트 | 첫번째 비트 |
1. (GENOTYPE & 2) != 2
이 연산은 GENOTYPE의 두 번째 비트
가 꺼져 있는지 확인하는 절차이다.
비트 연산 &를 사용하여 GENOTYPE에서 두 번째 비트(2진수 값: 2 = 0010)
가 켜져 있는지 확인한다.
결과가 2가 아니라면(즉, 0이라면), 두 번째 비트가 꺼져 있는 것이다.
2. ((GENOTYPE & 4) = 4 OR (GENOTYPE & 1) = 1)
GENOTYPE의 세 번째 비트(값 4, 2진수 0100) 또는 첫 번째 비트(값 1, 2진수 0001) 중 하나 이상이 켜져 있는지 확인
첫 번째 조건 (GENOTYPE & 4) = 4
세 번째 비트가 1인지 확인
두 번째 조건 (GENOTYPE & 1) = 1
첫 번째 비트가 1인지 확인
둘 중 하나라도 만족하면 참(OR 조건)
'Algorithm > SQL테스트' 카테고리의 다른 글
[프로그래머스] 👩🏻💻 (MySQL) SUM, MAX, MIN 문제 풀이 (49) | 2024.11.19 |
---|---|
[프로그래머스] 👩🏻💻 (MySQL) 특정 형질을 가지는 대장균 찾기 문제 풀이 (4) | 2024.11.19 |
[프로그래머스] 👩🏻💻 (MySQL) 조건에 맞는 개발자 찾기 문제풀이 (67) | 2024.11.18 |
[프로그래머스] 👩🏻💻 (Oracle/MySQL) 🐠 가장 큰 물고기 10마리 구하기 / 특정 물고기를 잡은 총 수 구하기 문제풀이 (49) | 2024.11.18 |
[프로그래머스] 👩🏻💻 (MySQL) 🐠 잔챙이 잡은 수 구하기 문제풀이 (56) | 2024.11.18 |