문제
builder 패턴은 복잡한 객체를 단계별로 구성하고 마지막에 최종 결과를 만들어 내므로, 호출자는 각 부분을 어떤 순서로든 설정할 수 있습니다.
각 부분은 키워드, 공백, 그리고 그 뒤의 텍스트로 이루어집니다:
select <columns>: 쉼표로 구분된 열 이름들입니다(쉼표 주변의 공백은 달라질 수 있습니다). 선택 사항이며, 기본값은*입니다.from <table>: 필수입니다.where <condition>,order <columns>,limit <n>: 선택 사항입니다.
키워드가 한 번 이상 나타나면, 마지막 것이 적용됩니다. 쿼리는 다음 고정된 순서로, 단일 공백을 사용하여 만드세요:
SELECT <columns> FROM <table>[ WHERE <condition>][ ORDER BY <columns>][ LIMIT <n>]
SELECT 목록에서는 각 열을 trim하고 , 로 이어 붙이세요. 그 밖의 텍스트는 그대로 복사합니다.
query_builder(parts)를 구현하세요.
Input
parts: 순서와 관계없이 주어지는 조각들입니다.
Output
SQL 쿼리 문자열을 반환하세요.
제약 조건
1 ≤ 부분 수 ≤ 20
from 부분이 적어도 하나 있음; 각 부분은 최대 100자
예시
입력:
parts = ["where age \u003e 18", "from users", "select name,age"]
예상 출력:
expected = "SELECT name, age FROM users WHERE age \u003e 18"
입력:
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};
예상 출력:
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
입력:
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};
예상 출력:
string expected = "SELECT name, age FROM users WHERE age \u003e 18";
설명
조각들은 순서가 뒤섞여 들어오지만, 쿼리는 항상 SELECT … FROM … WHERE … 형태로 만들어집니다: "SELECT name, age FROM users WHERE age > 18".
입력:
parts = ["from orders", "limit 10", "order total DESC"]
예상 출력:
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
입력:
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};
예상 출력:
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
입력:
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};
예상 출력:
string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
설명
select 부분이 없으면 열은 기본값으로 *가 됩니다: "SELECT * FROM orders ORDER BY total DESC LIMIT 10".
접근 방법
먼저 스스로 풀어 본 뒤 힌트를 하나씩 열어 보세요.
힌트 1
먼저 조각을 키워드별로 저장하고 문자열은 마지막에 만드세요.
힌트 2
같은 키워드의 조각이 나중에 오면 앞의 것을 대체합니다.
힌트 3
SELECT 목록의 각 열은 공백을 없애고, select 조각이 없으면 *를 쓰세요.
예상 복잡도
시간 O(전체 길이), 추가 공간 O(전체 길이)
참고 자료
이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.