광주인력개발원

<똘똘이> 팀이 내주신 문제 풀이 완료 [2023-04-19 학습일지]

플광 2023. 5. 29. 10:25

 

데이터셋을 친절히 제공해주셨다.

"""

FILE_NAME : team_problem_recommend_car.py

출제팀 : 똘똘이조

출제일자 : 2023-04-18

문제 이름 : [차량 추천기]

조건 :

다음과 같은 차량이 목록이 있을때

사용자가 원하는 차량 추천해주기

 

조건1. 국산인지 외제인지

조건2. 세단인지 suv인지

조건3. 어떤 브랜드인지

조건4. 크기는 어떤지

조건5. 전기차인지 아닌지

 

최종적으로

브랜드와 차크기(세그먼트)와 차명 출력

조건에 맞지않은 차를 고르면 그런차는 존재하지않는다고 출력

 

"""

# TODO : 주요 변수 선언
# 한번에 데이터셋을 불러옴
brand_data_store = {1: ['기아', '국산차'], 2: ['현대', '국산차'], 3: ['제네시스', '국산차'], 4: ['르노', '국산차'], 5: ['쌍용', '국산차'],
                    6: ['쉐보레', '국산차'], 7: ['BMW', '외제차'], 8: ['Benz', '외제차'], 9: ['Audi', '외제차'],
                    10: ['Porsche', '외제차'],
                    11: ['Koenigsegg', '외제차'], 12: ['Tesla', '외제차'], 13: ['Land_Rover', '외제차'], 14: ['Jeep', '외제차']}
# 연번 / [ 브랜드, 제조국가 ]
#분류 A 초소형, B 소형, C 준중형, D 중형, E 준대형, F 대형, S 스포츠카
car_data_store = {1: ['셀토스', '기아', 'B세그먼트', '내연기관', 'suv', '국내'], 2: ['스포티지', '기아', 'C세그먼트', '내연기관', 'suv', '국내'],
                  3: ['쏘렌토', '기아', 'D세그먼트', '내연기관', 'suv', '국내'], 4: ['모하비', '기아', 'F세그먼트', '내연기관', 'suv', '국내'],
                  5: ['베뉴', '현대', 'A세그먼트', '내연기관', 'suv', '국내'], 6: ['코나', '현대', 'B세그먼트', '내연기관', 'suv', '국내'],
                  7: ['투싼', '현대', 'C세그먼트', '내연기관', 'suv', '국내'], 8: ['싼타페', '현대', 'D세그먼트', '내연기관', 'suv', '국내'],
                  9: ['펠리세이드', '현대', 'E세그먼트', '내연기관', 'suv', '국내'], 10: ['Gv60', '제네시스', 'C세그먼트', '전기차', 'suv', '국내'],
                  11: ['Gv70ev', '제네시스', 'D세그먼트', '전기차', 'suv', '국내'],
                  12: ['Gv70', '제네시스', 'D세그먼트', '내연기관', 'suv', '국내'],
                  13: ['Gv80', '제네시스', 'E세그먼트', '내연기관', 'suv', '국내'], 14: ['Xm3', '르노', 'C세그먼트', '내연기관', 'suv', '국내'],
                  15: ['Qm6', '르노', 'D세그먼트', '내연기관', 'suv', '국내'], 16: ['트랙스', '쉐보레', 'B세그먼트', '내연기관', 'suv', '국내'],
                  17: ['트레일블레이저', '쉐보레', 'C세그먼트', '내연기관', 'suv', '국내'],
                  18: ['트래버스', '쉐보레', 'F세그먼트', '내연기관', 'suv', '국내'],
                  19: ['렉스턴', '쌍용', 'E세그먼트', '내연기관', 'suv', '국내'], 20: ['티볼리', '쌍용', 'C세그먼트', '내연기관', 'suv', '국내'],
                  21: ['코란도', '쌍용', 'D세그먼트', '내연기관', 'suv', '국내'], 22: ['X1', 'BMW', 'C세그먼트', '내연기관', 'suv', '외국'],
                  23: ['X3', 'BMW', 'D세그먼트', '내연기관', 'suv', '외국'], 24: ['X5', 'BMW', 'E세그먼트', '내연기관', 'suv', '외국'],
                  25: ['X7', 'BMW', 'E세그먼트', '내연기관', 'suv', '외국'], 26: ['GLA', 'Benz', 'C세그먼트', '내연기관', 'suv', '외국'],
                  27: ['GLC', 'Benz', 'D세그먼트', '내연기관', 'suv', '외국'], 28: ['GLE', 'Benz', 'E세그먼트', '내연기관', 'suv', '외국'],
                  29: ['GLS', 'Benz', 'F세그먼트', '내연기관', 'suv', '외국'], 30: ['Q3', 'Audi', 'C세그먼트', '내연기관', 'suv', '외국'],
                  31: ['Q5', 'Audi', 'D세그먼트', '내연기관', 'suv', '외국'], 32: ['Q7', 'Audi', 'E세그먼트', '내연기관', 'suv', '외국'],
                  33: ['마칸', 'Porsche', 'D세그먼트', '내연기관', 'suv', '외국'],
                  34: ['카이엔', 'Porsche', 'E세그먼트', '내연기관', 'suv', '외국'],
                  35: ['레인지로버 이보크', 'Land_Rover', 'C세그먼트', '내연기관', 'suv', '외국'],
                  36: ['레인지로버 벨라', 'Land_Rover', 'D세그먼트', '내연기관', 'suv', '외국'],
                  37: ['레인지로버', 'Land_Rover', 'E세그먼트', '내연기관', 'suv', '외국'],
                  38: ['레니게이드', 'Jeep', 'C세그먼트', '내연기관', 'suv', '외국'],
                  39: ['랭글러', 'Jeep', 'D세그먼트', '내연기관', 'suv', '외국'],
                  40: ['그랜드체로키', 'Jeep', 'E세그먼트', '내연기관', 'suv', '외국'],
                  41: ['K3', '기아', 'C세그먼트', '내연기관', 'sedan', '국내'],
                  42: ['K5', '기아', 'D세그먼트', '내연기관', 'sedan', '국내'], 43: ['K8', '기아', 'E세그먼트', '내연기관', 'sedan', '국내'],
                  44: ['K9', '기아', 'F세그먼트', '내연기관', 'sedan', '국내'], 45: ['스팅어', '기아', 'D세그먼트', '내연기관', 'sedan', '국내'],
                  46: ['아반떼', '현대', 'C세그먼트', '내연기관', 'sedan', '국내'],
                  47: ['G70', '제네시스', 'D세그먼트', '내연기관', 'sedan', '국내'],
                  48: ['G80', '제네시스', 'E세그먼트', '내연기관', 'sedan', '국내'],
                  49: ['G90', '제네시스', 'F세그먼트', '내연기관', 'sedan', '국내'],
                  50: ['쏘나타', '현대', 'D세그먼트', '내연기관', 'sedan', '국내'], 51: ['그랜저', '현대', 'E세그먼트', '내연기관', 'sedan', '국내'],
                  52: ['SM6', '르노', 'D세그먼트', '내연기관', 'sedan', '국내'],
                  53: ['1시리즈', 'BMW', 'C세그먼트', '내연기관', 'sedan', '외국'],
                  54: ['3시리즈', 'BMW', 'D세그먼트', '내연기관', 'sedan', '외국'],
                  55: ['5시리즈', 'BMW', 'E세그먼트', '내연기관', 'sedan', '외국'],
                  56: ['7시리즈', 'BMW', 'F세그먼트', '내연기관', 'sedan', '외국'],
                  57: ['A클래스', 'Benz', 'C세그먼트', '내연기관', 'sedan', '외국'],
                  58: ['C클래스', 'Benz', 'D세그먼트', '내연기관', 'sedan', '외국'],
                  59: ['E클래스', 'Benz', 'E세그먼트', '내연기관', 'sedan', '외국'],
                  60: ['S클래스', 'Benz', 'F세그먼트', '내연기관', 'sedan', '외국'],
                  61: ['A4', 'Audi', 'D세그먼트', '내연기관', 'sedan', '외국'],
                  62: ['A6', 'Audi', 'E세그먼트', '내연기관', 'sedan', '외국'],
                  63: ['A8', 'Audi', 'F세그먼트', '내연기관', 'sedan', '외국'],
                  64: ['파나메라', 'Porsche', 'F세그먼트', '내연기관', 'sedan', '외국'],
                  65: ['911', 'Porsche', 'S세그먼트', '내연기관', 'sedan', '외국'],
                  66: ['타이칸', 'Porsche', 'E세그먼트', '전기차', 'sedan', '외국'],
                  67: ['718', 'Porsche', 'S세그먼트', '내연기관', 'sedan', '외국'],
                  68: ['모델 S', 'Tesla', 'F세그먼트', '전기차', 'sedan', '외국'],
                  69: ['모델 3', 'Tesla', 'D세그먼트', '전기차', 'sedan', '외국'],
 
                  70: ['모델 X', 'Tesla', 'D세그먼트', '전기차', 'sedan', '외국'],
                  71: ['모델 Y', 'Tesla', 'D세그먼트', '전기차', 'sedan', '외국'],
                  72: ['제스코', 'Koenigsegg', 'S세그먼트', '내연기관', 'sedan', '외국'],
                  73: ['아제라', 'Koenigsegg', 'S세그먼트', '내연기관', 'sedan', '외국']}
# 연번 / [ 차이름, 브랜드, 세그먼트, 엔진방식, 외형타입, 제조국가 ]
user_select_brand = 0
user_select_segment = 0
user_select_type = 0
user_select_appearance = 0
user_select_country = 0
# TODO : INTRO
intro_message = """<자동차 어드바이저>
다음 입력을 통해 원하는 차를 골라드립니다."""
print(intro_message)
# TODO : 사용자에게 선호 묻기 (국산 or 외국산) 입력 받기
ask_message = """국산차가 좋나요? 외제차가 좋나요?
[1. 국산차]
[2. 외제차]
[번호 입력] : """
user_select_country = input(ask_message)
if user_select_country == '1':
    user_select_country = '국내'
else:
    user_select_country = '외국'
# TODO : 사용자에게 선호 묻기 (세단 or SUV) 입력 받기
ask_message = """세단이 좋나요? SUV가 좋나요?
[1. 세단]
[2. SUV]
[번호 입력] : """
user_select_appearance = input(ask_message)
if user_select_appearance == '1':
    user_select_appearance = 'sedan'
else:
    user_select_appearance = 'suv'
# TODO : 사용자에게 선호 묻기 (브랜드) 입력 받기 국산 / 외제차 브랜드 나뉘게
if user_select_country == '국내':
    ask_message = f"""어느 브랜드가 좋습니까?
[ 1. {brand_data_store[1][0]:^12}]
[ 2. {brand_data_store[2][0]:^12}]
[ 3. {brand_data_store[3][0]:^12}]
[ 4. {brand_data_store[4][0]:^12}]
[ 5. {brand_data_store[5][0]:^12}]
[ 6. {brand_data_store[6][0]:^12}]
[번호 입력] : """
else:
    ask_message = f"""어느 브랜드가 좋습니까?
[ 1. {brand_data_store[7][0]:^12}]
[ 2. {brand_data_store[8][0]:^12}]
[ 3. {brand_data_store[9][0]:^12}]
[ 4. {brand_data_store[10][0]:^12}]
[ 5. {brand_data_store[11][0]:^12}]
[ 6. {brand_data_store[12][0]:^12}]
[ 7. {brand_data_store[13][0]:^12}]
[ 8. {brand_data_store[14][0]:^12}]
[번호 입력] : """
user_select_brand = input(ask_message)
if user_select_country == '국내':
    if user_select_brand == "1":
        user_select_brand = brand_data_store[1][0]
    elif user_select_brand == "2":
        user_select_brand = brand_data_store[2][0]
    elif user_select_brand == "3":
        user_select_brand = brand_data_store[3][0]
    elif user_select_brand == "4":
        user_select_brand = brand_data_store[4][0]
    elif user_select_brand == "5":
        user_select_brand = brand_data_store[5][0]
    elif user_select_brand == "6":
        user_select_brand = brand_data_store[6][0]
else:
    if user_select_brand == "1":
        user_select_brand = brand_data_store[7][0]
    elif user_select_brand == "2":
        user_select_brand = brand_data_store[8][0]
    elif user_select_brand == "3":
        user_select_brand = brand_data_store[9][0]
    elif user_select_brand == "4":
        user_select_brand = brand_data_store[10][0]
    elif user_select_brand == "5":
        user_select_brand = brand_data_store[11][0]
    elif user_select_brand == "6":
        user_select_brand = brand_data_store[12][0]
    elif user_select_brand == "7":
        user_select_brand = brand_data_store[13][0]
    elif user_select_brand == "8":
        user_select_brand = brand_data_store[14][0]
 
# TODO : 사용자에게 선호 묻기 (크기(세그먼트)) 입력 받기
ask_message = """선호하는 크기를 선택하세요.
[ 1. 초소형  ]
[ 2. 소형    ]
[ 3. 준중형  ]
[ 4. 중형    ]
[ 5. 준대형  ]
[ 6. 대형    ]
[ 7. 스포츠카 ]
[번호 입력] : """
user_select_segment = input(ask_message)
if user_select_segment == "1":
    user_select_segment = 'A세그먼트'
elif user_select_segment == "2":
    user_select_segment = 'B세그먼트'
elif user_select_segment == "3":
    user_select_segment = 'C세그먼트'
elif user_select_segment == "4":
    user_select_segment = 'D세그먼트'
elif user_select_segment == "5":
    user_select_segment = 'E세그먼트'
elif user_select_segment == "6":
    user_select_segment = 'F세그먼트'
elif user_select_segment == "7":
    user_select_segment = 'S세그먼트'
# TODO : 사용자에게 선호 묻기 (전기차 여부) 입력 받기
ask_message = """연료 타입은 어떤게 좋습니까?
[ 1. 내연기관  ]
[ 2. 전기차    ]
[번호 입력] : """
user_select_type = input(ask_message)
if user_select_type == "1":
    user_select_type = '내연기관'
elif user_select_type == "2":
    user_select_type = '전기차'

# TODO : 사용자 입력값 정리
summary_message = f"""
입력하신 정보는 다음과 같습니다.
    브랜드 : {user_select_brand}
    차량 크기 : {user_select_segment}
    연료 타입 : {user_select_type}
    차량 타입 : {user_select_appearance}
    제조 국가 : {user_select_country}
[결과]"""
print(summary_message)
result = '안타깝게도 그런 차는 없습니다. 다시 시도 해보세요.'  # default
result_list = []
# 연번 / [ 차이름, 브랜드, 세그먼트, 엔진방식, 외형타입, 제조국가 ]
if car_data_store[1][1] == user_select_brand and car_data_store[1][2] == user_select_segment and car_data_store[1][
    3] == user_select_type and car_data_store[1][4] == user_select_appearance and car_data_store[1][
    5] == user_select_country:
    result_list.append(car_data_store[1][0])

if car_data_store[2][1] == user_select_brand and car_data_store[2][2] == user_select_segment and car_data_store[2][
    3] == user_select_type and car_data_store[2][4] == user_select_appearance and car_data_store[2][
    5] == user_select_country:
    result_list.append(car_data_store[2][0])
 

여기서부터 71번 인덱스까지 무한 if 지옥..

이 또한 편법을 사용하면.. 오탈자 없이 순식간 작성 가능하다.

if car_data_store[70][1] == user_select_brand and car_data_store[70][2] == user_select_segment and car_data_store[70][
    3] == user_select_type and car_data_store[70][4] == user_select_appearance and car_data_store[70][
    5] == user_select_country:
    result_list.append(car_data_store[70][0])

if car_data_store[71][1] == user_select_brand and car_data_store[71][2] == user_select_segment and car_data_store[71][
    3] == user_select_type and car_data_store[71][4] == user_select_appearance and car_data_store[71][
    5] == user_select_country:
    result_list.append(car_data_store[71][0])

if len(result_list) == 0:
    print(result)
else:
    print('원하시는 차종은 다음과 같습니다.')
    print(*result_list, sep=', ')

print('이용해주셔서 감사합니다.')
 

후기 :

첨부해주신 데이터셋을 그대로 활용하기엔 문제를 풀기에 너무 로직이 복잡해진다고 판단하였다. 그리하여 데이터 크기가 크지 않기 때문에, 데이터를 통합하는 과정을 거쳤고, sql 느낌처럼 글자가 같으면 조건이 만족하게끔 하나의 테이블을 놓고 비교하는 전략을 택했다.

 

보내주신 데이터에선, 국내 브랜드에 쌍용과 쉐보레가 빠져있었다. 나는 1개의 테이블을 만드느라, 뭔가 외래키 참조처럼 로직이 구성되었고, 오류가 나는 부분을 바로 잡아 수정하는 과정을 거쳤다.

 

데이터를 정리하느라 시간이 조금 걸렸지만, 이 또한 좋은 훈련과 트라이가 되었다.

 

아래는 보내주신 데이터셋을 하나의 데이터셋으로 만들기 위해 사용한 방법입니다. for문을 아직 모르시는 분들은 나중에 배우고 다시 한번 와서 봐주시면 이해가 되실겁니다.

 

# 연번 / [ 차이름, 브랜드, 세그먼트, 엔진방식, 외형타입, 제조국가 ]
# 도메인 분석
# 차이름 : 많음
# 브랜드 : 많음
# 세그먼트 : A~ F, S
# 엔진방식 : 내연기관, 전기차
# 외형타입 : 세단, SUV
# 제조국가 : 국산, 외제

my_dict = dict()
index = 1
for k, v in suv.items():
    temp_list = [k]
    temp_list.extend(v)
    if '전기차' != temp_list[len(temp_list) - 1]: # 전기차는 리스트 마지막에 '전기차'라고 요소가 추가 되어있음
        temp_list.append('내연기관') # 내연기관차들의 자리를 채워주기 위해 따로 추가해줌
    temp_list.append('suv')
    my_dict.update({index: temp_list})
    index += 1
for k, v in sedan.items():
    temp_list = [k]
    temp_list.extend(v)
    if '전기차' != temp_list[len(temp_list) - 1]:
        temp_list.append('내연기관')
    temp_list.append('sedan')
    my_dict.update({index: temp_list})
    index += 1
print(my_dict) # 출력된 문자 그대로 복사 붙여넣기하면 자료형을 인식해준다

for k, v in new_dict.items():
    if brand[v[1]] == '국산차': # 'brand' 딕셔너리를 참조하여 국산차라고 되어있으면, 제조국가 '국내'를 추가한다
        new_dict.get(k).append('국내')
    else:
        new_dict.get(k).append('외국')
print(new_dict)


for i in range(1, 72): # if 지옥 탈출법
    print(f"""
if car_data_store[{i}][1] == user_select_brand and car_data_store[{i}][2] == user_select_segment and car_data_store[{i}][
    3] == user_select_type and car_data_store[{i}][4] == user_select_appearance and car_data_store[{i}][
    5] == user_select_country:
    result_list.append(car_data_store[{i}][0])
    """)
 

감사합니다.