Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 이분탐색
- 구현
- docker
- 트랜잭샨
- 디버깅
- piplining
- 쿠키
- 객체지향패러다임
- prg 패턴
- 코드 계약
- 셀러리
- 알람 시스템
- 결제서비스
- 좋은 코드 나쁜 코드
- BFS
- 프로그래머스
- jwt 표준
- 수신자 대상 다르게
- branch 전략
- 카카오
- 깊게 생각해보기
- 검색어 추천
- 백준
- gRPC
- 숫자 블록
- 완전탐색
- AWS
- spring event
- 레디스 동시성
- 누적합
Archives
- Today
- Total
코딩관계론
[과제테스트] 게임 승률 조회하기(python) 본문
반응형
문제 이해하기
문제가 총 두가지가 있다. 하나는 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을 사용할 수 있습니다.
반응형
'개발 > 알고리즘' 카테고리의 다른 글
[카카오] 두 큐 합 같게 만들기 (0) | 2024.08.23 |
---|---|
[백준]AC (0) | 2024.05.11 |
[백준] 암호 만들기 (0) | 2024.05.07 |
[카카오] 가사검색 (0) | 2024.05.06 |
[프로그래머스] 올바른 괄호의 갯수 (0) | 2024.05.03 |