개발/알고리즘
[과제테스트] 게임 승률 조회하기(python)
개발자_티모
2024. 5. 19. 02:28
반응형
문제 이해하기
문제가 총 두가지가 있다. 하나는 json파일을 읽어 고객의 tag와 username을 오름차순으로 반환하는 것과 쿼리파라마으로 tag와 username이 주어지면 승률을 반환하는 형식이다.
json파일로 고객의 정보가 아래의 형태로 나타난다.
{
"id": 1,
"username": "wt7Py",
"tag": "bOCv",
"win": 617,
"lose": 875
}
문제 해결 방법 설명하기
1. 고객의 username과 tag로 정렬하는 방법
내가 사용한 방법은 읽어온 json파일에서 tag와 username만 따로 저장한 후 해당 값들을 key로 잡아서 정렬하는 것이었다.
@app.route("/api/gamerecord/users", methods=["GET"])
def get_users():
records = read_json_file("records.json")
customer = []
for record in records:
customer.append({'tag': record['tag'] , 'username': record['username']})
sorted_customer = sorted(customer, key=lambda x: (x['username'], x['tag']))
response = make_response(jsonify(sorted_customer), 200)
return response
2. username과 tag가 일치하는 고객을 찾아 승률 계산하기.
쿼리파람으로 username과 tag가 넘어온다. 물런 username과 tag가 항상 넘어오지 않기 때문에(문제의 조건) 둘 중 하나다로 없다면 401코드와 함께 error 내용을 반환해야 한다.
username = request.args.get('username', '')
tag = request.args.get('tag', '')
if username == "" or tag == "":
error = {'error':"Invalid data format"}
response = make_response(jsonify(error), 401)
return response
username과 tag가 일치하는 고객의 승률을 가져오기 위해서 고객의 username과 tag를 키로 두고 승률을 valuse로 하는 Dict 타입을 이용했다.
tag와username이 동시에 만족하지 않는 경우는 error임으로 key값에 있는지 확인한 후 없으면 에러처리를 해줬다.
for record in records:
customer_data[(record['tag'], record['username'])] = int((record['win'] / (record['win'] + record['lose'])) * 100)
if (tag, username) in customer_data:
result = {"winrate":customer_data[(tag, username)]}
response = make_response(jsonify(result), 200)
else:
error = {'error':"data not found"}
response = make_response(jsonify(error), 404)
코드
from flask import Flask, json, request, make_response, jsonify
from collections import defaultdict
app = Flask(__name__)
DATA_DIR = "./data/input/"
def read_json_file(file_name):
with open(DATA_DIR+file_name,'r') as f:
result = json.load(f)
return result
@app.route("/api/gamerecord/users", methods=["GET"])
def get_users():
records = read_json_file("records.json")
customer = []
for record in records:
customer.append({'tag': record['tag'] , 'username': record['username']})
sorted_customer = sorted(customer, key=lambda x: (x['username'], x['tag']))
response = make_response(jsonify(sorted_customer), 200)
return response
# "0.0.0.0:5678/api/gamerecord/winrate?username=11ab1a1&tag=abcd"
@app.route("/api/gamerecord/winrate", methods=["GET"])
def get_winrate():
# 여기에 코드를 작성하세요.
records = read_json_file("records.json")
username = request.args.get('username', '')
tag = request.args.get('tag', '')
if username == "" or tag == "":
error = {'error':"Invalid data format"}
response = make_response(jsonify(error), 401)
return response
customer_data = defaultdict(int)
for record in records:
customer_data[(record['tag'], record['username'])] = int((record['win'] / (record['win'] + record['lose'])) * 100)
if (tag, username) in customer_data:
result = {"winrate":customer_data[(tag, username)]}
response = make_response(jsonify(result), 200)
else:
error = {'error':"data not found"}
response = make_response(jsonify(error), 404)
return response
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5678, debug=True)
배운점 정리하기
- Flask에서는 jsonify를 사용하여 딕셔너리 객체를 JSON 타입으로 반환할 수 있습니다.
- sorted 함수는 key 매개변수를 사용하여 특정 기준에 따라 리스트를 정렬할 수 있습니다.
- 쿼리 파라미터를 받아들이고 검증할 때 request.args.get을 사용할 수 있습니다.
반응형