배열 items가 있다고 가정해 보겠습니다. 각 items[i]는 [type_i, color_i, name_i] 형태의 세 가지 요소를 담고 있으며, 이는 i번째 아이템의 종류(type), 색상(color), 이름(name)을 나타냅니다. 여기에 더해, 두 개의 문자열 ruleKey와 ruleValue로 표현되는 규칙이 하나 주어집니다.
i번째 아이템이 이 규칙과 일치한다고 판단할 수 있는 조건은 다음 중 하나입니다.
- ruleKey = "type"이고 ruleValue = type_i인 경우
- ruleKey = "color"이고 ruleValue = color_i인 경우
- ruleKey = "name"이고 ruleValue = name_i인 경우
즉, 우리가 구해야 하는 것은 전체 아이템 중에서 규칙에 부합하는 항목의 개수입니다.
문제 예시
입력이 다음과 같다고 가정해 보겠습니다.
| 종류 | 색상 | 이름 |
|---|---|---|
| Bike | blue | ElecB |
| Car | silver | Sumo |
| Bike | blue | TVS |
이때 ruleKey = "color", ruleValue = "blue"라면 어떻게 될까요? ["Bike","blue","ElecB"]와 ["Bike","blue","TVS"] 두 항목이 색상 조건을 만족하므로, 출력값은 2가 됩니다.
해결 접근 방법
이 문제는 다음 단계를 따라 해결할 수 있습니다.
- 카운터 변수 count를 0으로 초기화합니다.
- ruleKey가 "type"이라면 → 모든 아이템을 순회하면서 items[i][0]이 ruleValue와 같으면 count를 1 증가시킵니다.
- ruleKey가 "color"라면 → 모든 아이템을 순회하면서 items[i][1]이 ruleValue와 같으면 count를 1 증가시킵니다.
- ruleKey가 "name"이라면 → 모든 아이템을 순회하면서 items[i][2]가 ruleValue와 같으면 count를 1 증가시킵니다.
- 최종적으로 count를 반환합니다.
Python 구현 코드
def solve(items, ruleKey, ruleValue):
count = 0
if ruleKey == "type":
for i in range(len(items)):
if items[i][0] == ruleValue:
count += 1
if ruleKey == "color":
for i in range(len(items)):
if items[i][1] == ruleValue:
count += 1
if ruleKey == "name":
for i in range(len(items)):
if items[i][2] == ruleValue:
count += 1
return count
items = [["Bike","blue","ElecB"],["Car","silver","Sumo"],["Bike","blue","TVS"]]
ruleKey = "color"
ruleValue = "blue"
print(solve(items, ruleKey, ruleValue))입력
[["Bike","blue","ElecB"],["Car","silver","Sumo"],["Bike","blue","TVS"]], "color", "blue"
출력
2
추가 개선: 딕셔너리 활용
위 코드는 if문이 반복되어 다소 길게 느껴질 수 있습니다. 인덱스 매핑을 딕셔너리로 처리하면 코드를 훨씬 간결하게 만들 수 있습니다.
def solve(items, ruleKey, ruleValue):
key_index = {"type": 0, "color": 1, "name": 2}
idx = key_index[ruleKey]
return sum(1 for item in items if item[idx] == ruleValue)이처럼 규칙 키에 해당하는 열 인덱스를 미리 정의해 두면, 단 한 줄의 순회로 문제를 해결할 수 있습니다. 시간 복잡도는 O(n)으로 동일하지만, 코드의 가독성과 유지보수성이 크게 향상됩니다.