+참고하세요) [python example #4-1] dictionary자료형을 사용하여 최빈값 뽑아내기

[PYTHON] 최빈값 출력하기 - dictionary사용안하고 list만 사용

이전에 포스팅한 [dictionary자료형을 사용하여 최빈값 뽑아내기 #4-1]보다 간단한 방법이에요 참고바랍니다.~

 

  • 문제 -> #4-1 포스팅과 같음

숫자로 이루어진 list에서 가장 많이 등장한 최빈값을 출력하세요

최빈값 1개 vs 최빈값 여러개 구별하기

  • 알고리즘 표현 -> #4-1포스팅과 다르니 읽어봐주세요!

1. input = [2,2,2,5,5,5,6,6,6,6,6,6,9,9,11,11,11,11,11,11]

 

2. input의 최댓값만큼 [0]으로만 이루어진 새로운 list를 만든다.

-> my_list라고 할 것

 

3. input의 각 값을 my_list의 위치라고 생각한다.

>> input값 = my_list의 위치값

 

ex) input의 첫번째 숫자인 4의 경우, 

my_list의 4번째(index는3 일 것) 값을 +1을 한다.

즉, input의 값이 나올때마다 my_list의 input의 값과 같은 위치에 값을 +1씩 증가시킨다.

 

4. 만약 my_list의 10번째(index는 9일 것)값이 5라면 input의 10이라는 숫자가 5번 나온 것이다.

 

  • input

[2,2,2,5,5,5,6,6,6,6,6,6,9,9,11,11,11,11,11,11]

 

>> 쉬운 이해를 위해 간단하게 구성

 

★경우 1) 최빈값이 1개인 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
input = [2,2,2,5,5,5,6,6,6,6,6,6,9,9,11,11,11,11,11,11]
 
max_input = max(input)
my_list = [0* max_input
print(my_list) #11개가 생김
for i in input:
    my_list[i-1+= 1 #input의 값 = my_list의 위치값, 나올때마다 +1하는 
    #i-1을 하는 이유는 파이썬의 index는 0부터 시작하기 때문이다.
    #즉 input의 1의 값은 my_list의 첫번째 index인 0번 index에서 +1을 하기위해서이다.
print(my_list)  
#[0, 3, 0, 0, 3, 6, 0, 0, 2, 0, 6]
#2-3번, 5-3번, 6-6번, 9-2번, 11-6번 나옴
 
#-------------경우1, 2의 다른 부분 ---------------#
print('my_list의 index를 1부터라고 했을 때, 최빈값은 %d 이며, 총 %d번 나왔다'
 % (my_list.index(max(my_list))+1,max(my_list) ))
#list.index(인덱스번호 알고싶은값) => list에서 가장 최댓값의 index를 구하는 함수
#my_list.index(max(my_list)) 이 함수는 첫번째 최빈값만 불러옴.
#------------------------------------------------#
cs
  • 결과값

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 3, 0, 0, 3, 6, 0, 0, 2, 0, 6]
input 리스트에서, 최빈값은 6 이며, 총 6번 나왔다

 

★경우 2) 최빈값이 여러개인 경우

  rf) 참고로, 이 문제는 최빈값이 두개임. : 6 & 11

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
input = [2,2,2,5,5,5,6,6,6,6,6,6,9,9,11,11,11,11,11,11]
 
max_input = max(input)
my_list = [0* max_input
print(my_list) #11개가 생김
for i in input:
    my_list[i-1+= 1 #input의 값을 my_list의 index라고 하고 나올때마다 +1하는 것이다.
    #i-1을 하는 이유는 파이썬의 index는 0부터 시작하기 때문이다.
    #즉 input의 1의 값은 my_list의 첫번째 index인 0번 index에서 +1을 하기위해서이다.
print(my_list)  
#[0, 3, 0, 0, 3, 6, 0, 0, 2, 0, 6]
#2-3번, 5-3번, 6-6번, 9-2번, 11-6번 나옴
 
#-------------경우1, 2의 다른 부분----------------#
num = 0 #최빈값의 개수
my_most = 0 #최빈값을 알기 위한 변수 -my_list의 위치 반환
for k in my_list:
    my_most += 1 #my_list의 위치값 = input의 값
    if k == max(my_list):
        num += 1 #최빈값이 나올때만 증가시킴
        print('input 리스트에서, 여러 최빈값중 %d번째 최빈값은 %d 이며, 총 %d번 나왔다.'
              % (num, my_most,max(my_list)))
        
print('이 input리스트에서 최빈값의 개수는 %d개 이다' % num)
#------------------------------------------------#
cs
  • 결과값

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 3, 0, 0, 3, 6, 0, 0, 2, 0, 6]
input 리스트에서, 여러 최빈값중 1번째 최빈값은 6 이며, 총 6번 나왔다.
input 리스트에서, 여러 최빈값중 2번째 최빈값은 11 이며, 총 6번 나왔다.
이 input리스트에서 최빈값의 개수는 2개 이다

 

  • 배울코드

1. list의 위치값은 index-1 이라는 것을 이해하기

2. list의 위치값을 input값이라고 생각하기

3. list.index(위치를 알고 싶은 값) = 위치 반환 > 리스트의 index구하는 코드 이해하기

 

*)

어떤 피드백이든 댓글부탁드립니다.

더 좋은 방법이 있다면 알려주세요.

도움이 되셨다면, 하트버튼 또는 댓글부탁드려요~

요청할 문제가 있다면 댓글 부탁드려요!!!

*(

 

 

[PYTHON] 스도쿠 풀기

  • 문제

9 x 9인 matrix가 스도쿠가 완벽하게 풀려있는지, 실패인지 확인할 수 있는 코드를 작성하세요.

  • 알고리즘 표현

★WHY

스도쿠가 잘 풀려있다면, 3x3 box의 숫자가 1~9까지 빠짐없이 나와있어야하며,

각 row의 숫자가 1~9까지 빠짐없이 나와있어야하며,

각 column의 숫자가 1~9까지 빠짐없이 나와있어야한다.

 

★METHOD(그림참조)

A. 먼저, 3x3의 박스를 검사 -> def cross_check(matrix) 라는 함수를 만듬.

B. 다음, row(가로 한 줄) 검사 -> def row_check(matrix) 라는 함수를 만듬. 

C. 마지막, column(세로 한 줄) 검사 -> def column_check(matrix) 라는 함수를 만듬.

 

★DETAIL 상세 설명

*) 각각의 함수 검사방법

1. row, column 뿐만 아니라  box까지도 하나의 list로 만든다.자료형으로 만들어

2. 그 list를 set()자료형으로 바꾼다. -> set자료형은 {중복을 제거 & 오름차순 정렬}이 자동으로 이루어짐

3. 다시 list()자료형으로 바꾼다. -> 숫자가 중복이 제거되어, 순서대로 정렬되어 있을 것

4. 이 최종 list의 총 개수가 (len()함수사용) 9개 라면 1~9까지 빠짐없이 box, row, column에 있음을 알 수 있다.

참고) set()때문에 중복이 제거되어서 7개이면 1~7/2~8/3~9 이런식으로 있는 것!!!

 

★THEREFORE

이 A, B, C세가지 함수가 모두 True 라면 스도쿠는 잘 풀려있는 것이다.

정답이면 "RIGHT"를 틀렸다면 "NOT RIGHT"를 출력

 

  • input

위에 나온 사진과 같습니다.

 

matrix = [[1, 4, 3, 6, 2, 8, 5, 7, 9], [5, 7, 2, 1, 3, 9, 4, 6, 8], [9, 8, 6, 7, 5, 4, 2, 3, 1], [3, 9, 1, 5, 4, 2, 7, 8, 6], [4, 6, 8, 9, 1, 7, 3, 5, 2], [7, 2, 5, 8, 6, 3, 9, 1, 4], [2, 3, 7, 4, 8, 1, 6, 9, 5], [6, 1, 9, 2, 7, 5, 8, 4, 3], [8, 5, 4, 3, 9, 6, 1, 2, 7]]

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
matrix = [list(map(int, input().split())) for _ in range(9)]
 
#print(matrix)
 
#A. 3 x 3 box 검사 -> 4중 for문 필요
def cross_check(matrix):
    i=0 #하나의 set를 만들기 위한 변수
     #3번 반복 : 
     #1set(0,1,2)행 > 총 3box
     #2set(3,4,5)행 > 총 3box
     #3set(6,7,8)행 > 총 3box
    for _ in range(3): # 총 3set
        s=0
        for _ in range(3): #한 set당 3개 box가 나옴
            my_list = [] #check할 list를 새로 생성
            
            #3x3 box 만들기
            for k in range(i,i+3): #3개의 행 for문
                for j in range(s,s+3): #한 행당 3개열 가져오기 (3x3 box이니까)
                    #print(j) # 중간 점검
                    my_list.append(matrix[k][j])
            #print(my_list) #중간 점검
            #box 하나 나옴
            my_list = set(my_list)
            my_list = list(my_list)
            if len(my_list) == 9 :
                s+=3 # 옆으로 3칸이동해 수행중인 set의 다음box검사
            else:
                return False
                break
        i+=3 #아래로 3칸이동해 다음 set 검사
    return True
#print(cross_check(matrix))
 
#B. row 검사
def row_check(matrix):
    for i in range(9):
        if len(list(set(matrix[i]))) == 9:
            continue
        else:
            return False
    return True
 
#print(row_check(matrix)) 
 
#C.column 검사
def column_check(matrix):
    for j in range(9):
        my_list = []
        for i in range(9):
            my_list.append(matrix[i][j])
        #print(my_list)
        if len(list(set(my_list))) == 9:
            continue
        else:
            return False
    return True
#print(column_check(matrix))
 
#최종 검사/ 모두 1~9까 빠짐없이 나와야(True) 스도쿠 검사 완료 
if cross_check(matrix) and row_check(matrix) and column_check(matrix):
    print("RIGHT")
else:
    print("NOT RIGHT")
cs

 

  • 배울코드

1. 3x3 box검사를 위한 함수를 완벽하게 이해해보기

-> 그림으로 표현해봤습니다. 참고하세요

 

*)

어떤 피드백이든 댓글부탁드립니다.

더 좋은 방법이 있다면 알려주세요.

도움이 되셨다면, 하트버튼 또는 댓글부탁드려요~

요청할 문제가 있다면 댓글 부탁드려요!!!

*(

[PYTHON] 행렬의 합과 최대값구하기

+) 코드에 문제가 있어 수정완료함

  • 문제

n*n행렬의 각 행의합,각 열의합,대각선의 합을 구한 후, 최댓값을 출력하시오

  • 알고리즘 표현

1. n*n을 넣은 후, 각 행을 나타내는 list를 n번만큼 반복하여 n*n행렬을 만든다.

>> [[21, 15, 14, 16, 5], [11, 25, 31, 10, 18], [6, 9, 22, 17, 35], [12, 7, 29, 33, 10], [18, 24, 9, 30, 11]]

 

2.각 행의 합(rowsum), 각 열의 합(columnsum), 각 대각선의 합(first_daegaksun_sum, second_daegaksun_sum)을 만들어 dictionary형식으로 표현한다. { 행 or 열 or 대각선 : 합..}

>> {'1행의 합': 71, '1열의 합': 71, '2행의 합': 95, '2열의 합': 95, '3행의 합': 89, '3열의 합': 89, '4행의 합': 91, '4열의 합': 91, '5행의 합': 92, '5열의 합': 92, '첫번째 대각선의 합': 112, '두번째 대각선의 합': 62}

 

3. 그 dictionary의 value중 최댓값을 찾아 출력한다.

>> 모든 합들중 최대값은 112 이다

  • input

n * n 행렬 : 원하는 n의 값은? 5
1번째 row를 한칸씩 띠어서 쓰세요 : 21 15 14 16 5
2번째 row를 한칸씩 띠어서 쓰세요 : 11 25 31 10 18
3번째 row를 한칸씩 띠어서 쓰세요 : 6 9 22 17 35
4번째 row를 한칸씩 띠어서 쓰세요 : 12 7 29 33 10
5번째 row를 한칸씩 띠어서 쓰세요 : 18 24 9 30 11

 

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
matrix = [[211514165], [1125311018], [69221735], [127293310], [182493011]]
sum_list = {} #합들을 담을 dictionary
first_daegaksun_sum = 0  # 첫 대각선 \ 합
second_daegaksun_sum = 0 # 두번째 대각선 / 합
n=5 #5*5행렬이다.
for i in range(n):
    rowsum = 0 #행의 합
    columnsum = 0 #열의 합
    for j in range(n):
        rowsum += matrix[i][j]
        columnsum += matrix[j][i] #i와 j만 바꿔주면됨.
    sum_list[str(i+1)+'행의 합']=rowsum
    sum_list[str(i+1)+'열의 합']=columnsum #dic로 이쁘게 만들기
    first_daegaksun_sum += matrix[i][i]
    second_daegaksun_sum += matrix[i][n-i-1]
sum_list['첫번째 대각선의 합']=first_daegaksun_sum
sum_list['두번째 대각선의 합']=second_daegaksun_sum
 
 
#모든 것들의 합출력 dictionary
print(sum_list)
#{'1행의 합': 71, '1열의 합': 68, '2행의 합': 95, '2열의 합': 80, '3행의 합': 89, '3열의 합': 105, '4행의 합': 91, '4열의 합': 106, '5행의 합': 92, '5열의 합': 79, '첫번째 대각선의 합': 112, '두번째 대각선의 합': 62}
 
#이 value중 최대값 출력
print('모든 합들중 최대값은 {} 이다'.format(max(list(sum_list.values()))))
#모든 합들중 최대값은 112 이다
cs

 

  • 결과값

[[21, 15, 14, 16, 5], [11, 25, 31, 10, 18], [6, 9, 22, 17, 35], [12, 7, 29, 33, 10], [18, 24, 9, 30, 11]] 
{'1행의 합': 71, '1열의 합': 68, '2행의 합': 95, '2열의 합': 80, '3행의 합': 89, '3열의 합': 105, '4행의 합': 91, '4열의 합': 106, '5행의 합': 92, '5열의 합': 79, '첫번째 대각선의 합': 112, '두번째 대각선의 합': 62}
모든 합들중 최대값은 112 이다

 

  • 배울코드

1. row2 : matrix을 만들때, for문을 통한 input으로 넣어보는 것

2. 위 코드의 for문을 완벽하게 이해해보기

3. 열의합은 row와 똑같이 하고 i와 j만 바꾸면된다.

 

*)

어떤 피드백이든 댓글부탁드립니다.

더 좋은 방법이 있다면 알려주세요.

도움이 되셨다면, 하트버튼 또는 댓글부탁드려요~

요청할 문제가 있다면 댓글 부탁드려요!!!

*(

+이전포스팅 참고하세요)[python example #4-2]List자료형만 사용하여 최빈값 더 간단하게 구하기(최빈값 1개 vs 여러개)

[PYTHON] 최빈값 출력하기

  <숫자list, dictionary 사용> - 다음 포스팅에서 문자list예정(거의비슷)

문자list, 숫자list, 문자숫자혼합list 모두 사용가능

  • 문제

숫자로 이루어진 list에서 가장 많이 등장한 최빈값을 출력하세요

  • 알고리즘 표현

1. input = [4,13,2,55,34,14,14,23,2,2,55,5,55,34,34,34]

2. 결과 dictionary = {'4의 빈도': 1, '13의 빈도': 1, '2의 빈도': 3, '55의 빈도': 4, '34의 빈도': 4, '14의 빈도': 2, '23의 빈도': 1, '5의 빈도': 1}

  -> dictionary의 key값은 중복될 수 없음을 이용

  -> input을 하나씩 검사하면서 같은 숫자의 value값을 +1씩할 것이다.

3.  dictionary에서 가장 value값이 크게나온{'55의 빈도': 4, '34의 빈도': 4} 를 찾을 수 있다.

  -> 4. 즉, 최빈값 = 34, 55 이다.

  • input

input = [2,2,2,5,5,5,6,6,6,6,6,6,9,9,11,11,11,11,11,11]

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
input = [2,2,2,5,5,5,6,6,6,6,6,6,9,9,11,11,11,11,11,11]
 
def 숫자리스트최빈값(x): #x가 list로 주어질 때, 그 수 중에서 최빈값을 구할 것
    dictionary = {}
    for i in x:
        if dictionary.get(i) is None: #파이썬에선 없음을 None으로 표기
            dictionary[i] = 1 #i라는 숫자가 나올때 1을 삽입
        else:
            dictionary[i] += 1 #i라는 숫자의 빈도 증가
    #여러개의 최빈값을 뽑아내기
    most = max(dictionary.values()) #최빈값 추출 - 값중에 최대값 찾기
    max_list ={}
    #최빈값 dictionary만들기
    for key, value in dictionary.items():
        if value == most :
            max_list[key] = value
    print(dictionary) #{2: 3, 5: 3, 6: 6, 9: 2, 11: 6} :2가 3번, 5가 3번, 6이 6번....
    print(max_list)   #{6: 6, 11: 6} : 최빈값 리스트만 추출
    return max_list
 
final = 숫자리스트최빈값(input) # 최빈값만 뽑아낸 리스트 = max_list
print(final) #결과값 두번째줄
 
print("최빈값은 ", end = " ")
for key,value in final.items(): #최빈값 여러개일 경우 뽑기 가능
    print(key, end = " ")
print("입니다.")
 
cs
  • 결과값

{2: 3, 5: 3, 6: 6, 9: 2, 11: 6}
{6: 6, 11: 6}
{6: 6, 11: 6}
최빈값은  6 11 입니다.


-> 최빈값이 2개인 경우입니다. : 6, 11

  • 배울코드

1. dictionary 자료형을 for문안에 두고, key값도 달라지게 할 수 있음을 알아야한다.

2. if dictionary.get(key) is None 과 if key not in dictionary 이 같은역할을 하여 두 코드 모두 작동된다.

3. 여러개의 최빈값을 뽑아내는 방법을 알자

 

 

*)

어떤 피드백이든 댓글부탁드립니다.

더 좋은 방법이 있다면 알려주세요.

도움이 되셨다면, 하트버튼 또는 댓글부탁드려요~

요청할 문제가 있다면 댓글 부탁드려요!!!

*(

 

 

 

[PYTHON] 리스트 합치기

  <중복제거하여 자동으로 오름차순이 되게 리스트 합치기>

 

  • 문제

두 리스트를 중복을 제거하면서 오름차순으로 합치세요

  • 알고리즘 표현

1. 각 list를 먼저 sort()로 정렬을 한후에 한개씩 비교하며 더 작은 값을 새로운 list에 추가한다.

2. 추가한 후에 다음 index값을 비교하여 또다시 더 작은 값을 추가하는 방식이다.

3. 비교를 끝낸 후, list의 남은 부분은 최종적으로 한번에 추가한다.

알고리즘 표현

  • input 값

  5 
  1 4 6 3 2 
  7 
  2 6 3 9 6 13 11

 

1) 첫번째 방법 -> 정석적인 방법대로, 알고리즘 표현 방식대로

- 리스트를 하나씩 비교하며, 추가

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
32
33
34
35
36
= int(input()) #n_list의 개수 5
n_list = list(map(int, input().split())) #[1, 4, 6, 3, 2]
n_list.sort() #미리 정렬
= int(input()) #m_list의 개수 7
m_list = list(map(int, input().split())) #[2, 6, 3, 9, 6, 13, 11]
m_list.sort() #미리 정렬
## 여기까지는 입력값 출력
 
n_index = 0 #n_list의 index표현
m_index = 0 #m_list의 index표현
 
sum_list = [] #순서대로 숫자를 넣을 빈 깡통을 만들어준다.
 
#아래 과정은 각 list를 미리 정렬했기때문에 가능하다.
while n_index<and m_index<M: #각 list를 한개씩 반복하기, 더 적은 list 개수까지만 반복
    if n_list[n_index]<m_list[m_index] : #0부터 넣은 index중
        sum_list.append(n_list[n_index]) #더 작은 값부터 넣기 위함.
        n_index+=1
    elif n_list[n_index]>m_list[m_index]:#0부터 넣은 index중
        sum_list.append(m_list[m_index]) #더 작은 값부터 넣기 위함.
        m_index+=1 
    elif n_list[n_index]==m_list[m_index]:#두값이 같다면 각 list의 index를 모두 +1을 해야한다.(중복방지)
        sum_list.append(m_list[m_index])
        m_index+=1 #중요
        n_index+=1 #중요
 
if n_index<N: #list의 남은 값들을 모두 넣어준다.
    sum_list+=n_list[n_index::] # 마지막 index 생략 가능
if m_index<M: #list의 남은 값들을 모두 넣어준다.
    sum_list+=m_list[m_index::] # 마지막 index 생략 가능
 
print(sum_list) #합쳐진 최종 list출력
cs

 

  • 결과값

  [1, 2, 3, 4, 6, 7, 10, 13]

 

2) 두번째 방법 -> 파이썬의 자료형인 set을 이용한 방법

set이 무엇이냐!!

list처럼 하나의 자료형인데, 자동정렬 및 자동중복제거를 가능하게 해줌

즉 이 set으로 바꾼것을 다시 list로 바꾸면 내가 원하는 list형식으로 볼수 있다.

 

1. list끼리 더하기 -> 행렬의 합처럼 더해지는 것이 아니라 이어 붙여준다.

2. set(list)로 바꾸기 -> 중복제거 및 자동정력

3. 다시 list(set(list)) -> list의 형태로 보여지기 위함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
n_list = [14632]
# N = int(input()) #n_list의 개수
= len(n_list) # 위 코드와 같은 역할을 할 것이다.
#n_list.sort() -> 정렬할 필요 없다
 
m_list = [263961311]
# M = int(input()) #m_list의 개수
= len(m_list) # 위 코드와 같은 역할을 할 것이다.
#m_list.sort() -> 정렬할 필요 없다
## 여기까지는 입력값 출력
 
sum_list = n_list + m_list
sum_set = set(sum_list) # 자료형을 list -> set으로 변경
print(sum_set) # 결과값 1 row: set자료형으로 출력하기
print(list(sum_set)) # 결과값 2 row :list자료형으로 출력하기
cs
  • 결과값

{1, 2, 3, 4, 6, 9, 11, 13}

[1, 2, 3, 4, 6, 7, 10, 13]

  • 배울코드

1. 미리 정렬을 하여 더 쉽게 비교할 수 있다는 것을 기억해야한다.

2. 중복되는 값이 있을 수도 있기 때문에 if - elif - elif 순으로 해야한다.

3. row 26중요 - 만약,if n_list = m_list 로 했었다면> m_list의 index값이 증가되지 않아 같은 값이 비교되어 중복값이 그대로 나타났을 것이다.

-> 이것만 뽑아내면 리스트의 교집합을 구할 수 있다.

4. 사실, 두번째 방법은 진짜 간단..-> 파이썬으로 풀거면 이렇게 하면되요

 

*)

어떤 피드백이든 댓글부탁드립니다.

더 좋은 방법이 있다면 알려주세요.

도움이 되셨다면, 하트버튼 또는 댓글부탁드려요~

요청할 문제가 있다면 댓글 부탁드려요!!!

*(

 

+ Recent posts