Python 문제 50번

Jaeyong Park·2021년 11월 7일
0

Log In

dict에 대한 문제인데 clean code같이 코드를 획기적으로 줄이는 방법이 있기에 포스팅해보고 싶다.

Assignment

Input으로 주어진 list의 각 요소(element)가 해당 list에 몇번 나타나는지 수를 dictionary로 만들어서 return해주세요. Dictionary의 key는 list의 요소 값이며 value는 해당 요소의 총 빈도수 입니다.

예를 들어, 다음과 같은 list가 input으로 주어졌다면:

> my_list = ["one", 2, 3, 2, "one"]

Return값은

{
   "one" : 2,
    2 : 2,
    3: 1
}

List가 1차원이라면 Dictionary는 2차원 같은 느낌이다.
처음에 CS1을 접했을 때도 Dict까지 딱 배우고 Drop했던 것 같다.

1. 접근

어떻게 접근을 할까 고민을 하다가
2가지로 쪼개기로 했다.

  1. 요소들의 중복유무
  2. 빈도수.

그러기 위해서는 요소들을 읽는 for loop가 필요했고
처음 읽는 요소가 중복된 경우가 있으면 count +1을 해주는 식으로 돌려야겠다.

2. 풀이

그 코드는 아래와 같다.

def get_occurrence_count(input_list):

# 함수를 완성해 주세요.
    new_dict ={}
    occ_count=1
    for i in range(len(input_list)):
        for j in range(len(input_list)):
            if i!=j:
                if input_list[i]==input_list[j]:
                    occ_count +=1
        new_dict[input_list[i]]=occ_count

    return new_dict코드를 입력하세요

근데 occ_count가 이상하다.

결과값
{'one': 5, 2: 4, 3: 3}

Shit..

뭐가 문제지 했는데 아.. occ_count가 for loop바깥에 있으니까 다시 1로 안 돌아가고 그대로 저장된다. 여기서 한 20분 쓴것 같다. 아직 익숙하지가 않은 것 같다.

def get_occurrence_count(input_list):

# 함수를 완성해 주세요.
  new_dict ={}

  for i in range(len(input_list)):
      occ_count=1
      for j in range(len(input_list)):
          if i!=j:
              if input_list[i]==input_list[j]:
                  occ_count +=1
      new_dict[input_list[i]]=occ_count

  return new_dict

my_list = ["one", 2, 3, 2, "one"]

print(get_occurrence_count(my_list))

음. 잘 나온다.
근데 Dict에 바로 넣는 방법은 없을까?? 고민하다가
Dict에 대한 풀이를 찾아보았다.

3. 다른 풀이

def get_occurrence_count(my_list):
  my_dict = {}
  for value in my_list:
    if value in my_dict:
      my_dict[value] += 1
    else:
      my_dict[value] = 1

  return my_dict

오....
1. empty dictionary 생성
2. value를 생성해서 my_list에 있는 값들을 for 문으로 돌림.
3. 값이 존재하면 my_dict의 key값에 넣고 my_dict의 value값을 우선 else문에 저장(1이 value값)
4. 그러고 다시 또 돌리는데 같은 것을 만나면 my_dict[value]는 동일하기에 +=1로 카운트가 올라가면서 value값이 변함.
5. Return my_dict.

Log Out

코드가 간결해지면 그만큼 속도가 빨라진다. 문제를 푸는 것에 우선 집중하지만 그 후에 다시 코드리뷰를 할 때 어떻게 하면 더 간결하게 할 수 있을까??를 고민하는 습관을 계속 해야될 것 같다.

profile
01 Hello World. Login

0개의 댓글