미경이 스터디 6.15

코변·2022년 6월 15일
0
post-thumbnail

Photo by Pietro Mattia on Unsplash

크레인 인형뽑기 게임

def solution(board, moves):
    basket = []
    cnt = 0
    for move in moves:
        for i in range(len(board)):
            if board[i][move-1] and basket[-1:] == [board[i][move-1]]:
                board[i][move-1] = 0
                basket.pop()
                cnt+=1
                break
            if board[i][move-1]:
                basket.append(board[i][move-1])
                board[i][move-1] = 0
                break
    return cnt*2

이해한대로 룰 정리하기

  1. N * N 크기로 이루어진 정사각형 격자 안에 캐릭터들의 숫자가 주어진다.
  2. 정사각격자 안의 값이 0이라면 비어있는 칸이다.
  3. moves 안의 값들은 크레인이 뽑아낼 캐릭터의 열(column)값이다.
  4. 각 열의 행을 조회하면서 열의 최상단에 있는 캐릭터 값을 찾아서 basket에 넣는다. -> 이 때 빼온 board값을 0으로 바꿔주는게 포인트!
  5. 만약 basket 안의 '마지막 값'이 지금 뽑아온 캐릭터와 같다면 캐릭터는 사라진다.

문제 풀기

  • 무식하게 풀기를 시도해보았다. 우선 moves 배열에서 값을 하나씩 가져와 move라는 변수에 할당
  • move열에 해당하는 행값을 조회하기 위해서 board의 길이를 순회하는 for문을 선언
  • 행값이 0이 아니라면 basket에 넣어주고 board 값을 0으로 바꿔준다.
  • 또한 행값이 0이 아니면서 answer의 마지막값과 같다면 cnt(count)값을 하나 늘려주면서 answer의 마지막 값을 빼준다(pop)

반성점

무식하게 풀기를 시도한 다음 개선을 아래의 방식으로 밖에 하지 못했다. 분명히 저 길고 긴 코드를 줄일 수 있을 것 같은데 아직 고민이 부족하다. 전체 문제를 돌아보며 리팩터링 할 때 또 고쳐봐야겠다.

if board[i][move-1] != 0:
if board[i][move-1]: 

신고 결과 받기

def solution(id_list, reports, k):
    check = {report : report.split(' ')[-1] for report in reports}
    will_be_banned = [user_id for user_id in id_list if list(check.values()).count(user_id) > k-1]
    answer = [0]* len(id_list)
    for key in check.keys():
        splited_key = key.split(' ')
        report_p, reported_p = splited_key[0],splited_key[1]
        if reported_p in will_be_banned:
            answer[id_list.index(report_p)] +=1
    return answer

이해한대로 룰 정리하기

  1. 유저는 한 번에 한 명의 유저만을 신고할 수 있다.( 정확히는 여러번 신고는 가능하나 유효한 횟수가 1번 중복값 제거 필요)
  2. 주어진 k이상으로 신고가 되면 그 유저는 정지가 된다.
  3. 정지가 된 유저를 신고한 사람에게 메일로 정지가 됐다는 사실을 알린다.
  4. 주어진 유저목록의 순서에 따라서 정지확인 메일의 갯수를 리스트에 담아 반환

문제풀기

  • 일단 신고한 사람과 대상 이 둘의 유니크한 값이 필요해서 들어온 데이터 "유저id 신고한id"를 그대로 dictionary의 키 값으로 넣어 중복값을 걸렀다.
  • value에는 신고 대상을 split으로 분할한 후 신고한 아이디만을 추려서 담았다.
  • 여기서 살짝 시간이 걸렸던게 will_be_banned라는 리스트가 필요한지 여부가 헷갈렸다.
  • 나중에 로직을 변경해서 이 리스트를 삭제하더라도 현재 내가 생각한 로직에서는 필요한 것으로 판단되어 남겼다.
  • check에 저장한 키값을 토대로 신고당한 사람이 밴리스트에 있다면 그에 해당하는 신고자의 인덱스값을 찾는다.
  • 그 찾은 인덱스 값을 토대로 id_list길이만큼 미리 0으로 초기화 해놓은 answer에 1을 더해준다.
  • answer을 리턴하면 끝!
profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.

0개의 댓글