오늘은 PCCE 시리즈를 마치고, 새로운 알고리즘 시리즈를 찾던 와중 대장균 시리즈 Level1 ~ Level5까지 한 단계씩 있길래 한 문제씩 포스팅을 하고자 한다. ( ※ 물론 내가 Level5까지 다 풀 수 있다는 가정은 없다... 하지만 도전은 아름다운 것 )
그중 첫 번째 문제인 특정 형질을 가지는 대장균 찾기 문제부터 시작하겠다. 특이점은 DB Query문을 작성하는 문제로 특정 언어에 국한되지 않는다는 점이다.
알고리즘 난이도 및 시간 ( ※ 개인적인 의견 )
- 난이도 : Level 1( ※ Min : 0, Max : 10 )
- 풀이 시간 : 3분
- 제출 횟수 : 1번
- 풀이 결과 : Pass
문제 설명
아래 사진을 보면 문제가 굉장히 복잡한 것처럼 보이지만 그냥 DB Table에 들어가 있는 데이터들에 대한 설명이다. 이번 문제를 풀면서 딱히 필요 없는 내용이라 읽고 그렇구나 하고 넘어가면 된다.
결국 이번 문제는 아래 내용만 이해하면 푸는데 전혀 어려움이 없다. 여기서 문장을 읽으면서 "아 어떤 DB Query문이 필요하겠구나?"라는 걸 바로 알아채야 한다. 간단하게 설명하면 2번 형질은 보유하고 있지 않고, 1번 or 3번 형질을 보유하고 있는 대장균 수를 출력하는 문제다. 문제 풀이는 아래에서 문장별로 공유하겠다.
문제풀이
문제를 읽으면서 자연스럽게 머리에서 아래 내용이 매칭이 돼야 하는 문제다. 여기서 & 연산은 비트 AND 연산을 의미하며, 2 = 10, 4 = 100과 같이 바이너리로 이해하면 된다. 즉 자리에 맞는 십진수 값을 & 연산해서 1과 1인 경우에는 동일한 값을 반환하는지 확인하는 문제다.
- 2번 형질을 보유하지 않으면서 : 2 != (형질 & 2)
- 1번이나 3번 형질을 보유하고 있는 경우 : (1 == ( 형질 & 1)) || (4 == (형질 & 4))
- 최종 조건문 : (2 != (형질 & 2)) && ((1 == ( 형질 & 1)) || (4 == (형질 & 4)))
최종 DB Query문은 아래와 같다. 하지만 처음 보는 사람들은 아래 Query문을 보고 WHERE 절에 1=1은 왜 있지?라는 생각을 할 수 있다. 그 이유는 나중에 Query 디버깅을 할 때, 특정 Case에 따라 주석처리 할 때 불편함이 없기 위해 하는 것이 가장 크다. 추가로 나중에 Query 문을 특정 언어로 구현할 때도 훨씬 코드가 깔끔하고 편하다. ※ 본인도 현업에서 처음에 보고 무조건 Ture인데 왜 하는거지? 라는 의문을 품고 있었지만 실제로 사용해 보니 너무 편하다..라는 것을 알 수 있었다.
SELECT COUNT(*) AS COUNT
FROM ECOLI_DATA A
WHERE 1=1
AND (2 != (GENOTYPE & 2))
AND (((4 & GENOTYPE) = 4) OR (( 1 & GENOTYPE ) = 1))
결과
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/301646
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 대장균의 크기에 따라 분류하기 2 (1) | 2025.04.15 |
---|---|
프로그래머스 - 부모의 형질을 모두 가지는 대장균 찾기 (0) | 2025.02.11 |
프로그래머스 - [PCCE 기출문제] 10번 / 공원 C++ (0) | 2025.02.07 |
프로그래머스 - [PCCE 기출문제] 9번 / 지폐 접기 C++ (0) | 2024.11.17 |
프로그래머스 - [PCCE 기출문제] 8번 / 버스 C++ (0) | 2024.11.16 |