코딩관계론

[과제테스트] 게임 승률 조회하기(python) 본문

개발/알고리즘

[과제테스트] 게임 승률 조회하기(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)

배운점 정리하기

  1. Flask에서는 jsonify를 사용하여 딕셔너리 객체를 JSON 타입으로 반환할 수 있습니다.
  2. sorted 함수는 key 매개변수를 사용하여 특정 기준에 따라 리스트를 정렬할 수 있습니다.
  3. 쿼리 파라미터를 받아들이고 검증할 때 request.args.get을 사용할 수 있습니다.
반응형

'개발 > 알고리즘' 카테고리의 다른 글

[카카오] 두 큐 합 같게 만들기  (0) 2024.08.23
[백준]AC  (0) 2024.05.11
[백준] 암호 만들기  (0) 2024.05.07
[카카오] 가사검색  (0) 2024.05.06
[프로그래머스] 올바른 괄호의 갯수  (0) 2024.05.03