6.17 미경이 스터디

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

Photo by Pietro Mattia on Unsplash

[1차] 비밀지도

def solution(n, arr1, arr2):
    answers = []
    for i in range(n):
        answer = bin(arr1[i] | arr2[i])[2:]
        answer = answer.rjust(n,'0')
        answers.append(answer.replace('1','#').replace('0', ' '))
    return answers

내가 이해한 룰

  1. 사각형의 보물지도는 n * n 형태이다.
  2. 각 지도는 10진수로 이루어진 리스트로 주어진다.
  3. 리스트 안의 수를 2진수로 바꾼 값으로 보물지도를 추론할 수 있다. 0은 빈 공간 1은 벽이라고 한다.
  4. 두 장의 지도를 겹쳐서 한쪽이라도 벽인 부분은 전체 부분에서도 벽이고 모두 공백인 부분은 전체 지도에서도 공백이다.
  5. 즉 0 과 0은 0 이고 (1, 0) (0, 1) (1, 1) 은 1이라는 의미로 비트연산자 or을 떠올렸다.

문제풀이

위에 적힌 룰대로 하나하나 따라가면서 풀다보니 한줄짜리 예쁜 코드가 나왔다며 기뻐했다.

def solution(n, arr1, arr2):
    return [bin(arr1[i] | arr2[i])[2:].replace('1','#').replace('0', ' ') for i in range(n)]

그러나 4,5번 케이스의 실패를 만나게 되었고 이유는 2진수의 0부분이 채워지지 않아서 길이가 맞지 않게 된 것이었다.

처음에 2진수에 대한 이해가 부족하여 앞 뒤로 여기저기 0을 넣다가 또 이해가 안 된 코드를 치려고하는 못난 나를 발견하고 키보드에서 손을 떼고 생각을 해봤다.

예를 들어 0 과 1의 or 라고 하면 1이 나올텐데 문제에서 요구하는 자리수가 6자리라고 했을 때 1의 위치는 당연하게도 오른쪽 제일 끝이다 아니라면 다른 수가 되어버리기 때문이다.

그래서 결국 파이썬 내장함수인 rjust에 패딩을 더한 후 문자열의 길이값 n과 채울 값 '0'을 넣어주어 코드를 완성하게 되었다.

실패율

def solution(N, stages):
    stages_len = len(stages)
    answers = []
    for i in range(1, N+1):
        stage_cnt = stages.count(i)
        if stages_len == 0:
            answers.append((i, 0))
            continue
        answers.append((i, stage_cnt / stages_len))
        stages_len -= stage_cnt
    return [answer[0] for answer in sorted(answers, key=lambda x: x[1], reverse=True)]

내가 이해한 룰

  1. 주어진 스테이지의 갯수는 N개이다.
  2. 유저가 머물고 있는 스테이지의 숫자가 리스트로 주어진다.
  3. 스테이지 숫자가 N+1로 주어지기도 하는데 그 유저는 모든 스테이지를 클리어한 유저이다.
  4. 실패율은 스테이지에 도달했으나 클리어하지 못한 유저수 / 스테이지에 도달한 유저 수 이다.
  5. 실패율을 내림차순으로 정렬하고 그 순서대로 스테이지를 담아 반환해야한다.
  6. 스테이지에 도달한 유저가 없으면 실패율은 0이다.
  7. 실패율이 같으면 스테이지 숫자가 작은 순으로 정렬한다.

문제풀이

1. 실패한 풀이

  1. set을 사용하여 주어진 스테이지값의 유니크한 값을 얻었다.
  2. 유니크한 스테이지값을 토대로 stage.count()메소드로 스테이지 갯수를 구하고 stage_len으로 나눠 실패율을 구해주었다.
  3. 스테이지와 실패율을 튜플에 담아 answers에 넣어주었고
  4. stage_len에서 stage_cnt를 빼 이미 카운팅한 유저들을 제외시켰다.
  5. 마지막으로 sorted와 key=lambda를 통해서 실패율 순으로 정렬해주고
  6. list comprehension을 통해서 stage 값을 담아 반환하였다.

2. 실패한 이유와 고친점

  1. 유니크한 값만 사용함으로 인해서 다른 값들을 0으로 들지 못한다.
    -> for 문을 통해서 1부터 n+1까지의 값을 순회함 : 실패

  2. 난이도 조절에 실패하여 낮은 난이도에서 사람들이 많이 오르지 못한 경우 예를들어 도달해야하는 스테이지가 5라고 했을 때 stages = [3,2,3,1,2,3] 가 이런식으로 주어진다면 4스테이지부터는 zerodivision 에러가 남

-> stage_len == 0 조건을 추가하여 0으로 나누는일없이 바로 0으로 더해지도록 만듦

profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.

0개의 댓글