diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f18a5a --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +CCTV_PJT/ \ No newline at end of file diff --git a/03117_bae/main.py b/03117_bae/main.py deleted file mode 100644 index a9d5247..0000000 --- a/03117_bae/main.py +++ /dev/null @@ -1,7 +0,0 @@ -x = 2.4 -dkdkdk = 3.4 -c = x + dkdkdk -# 주석 -# 아무거나 -# 추가 아무거나 -# 설명 \ No newline at end of file diff --git "a/03122_Ji/2\354\243\274\354\260\250/importantroad_ji.py" "b/03122_Ji/2\354\243\274\354\260\250/importantroad_ji.py" new file mode 100644 index 0000000..d3aacad --- /dev/null +++ "b/03122_Ji/2\354\243\274\354\260\250/importantroad_ji.py" @@ -0,0 +1,18 @@ +# https://school.programmers.co.kr/learn/courses/30/lessons/214293 +# 자율주행 시스템은 도시 내에 있는 n개의 지점을 연결하는 +# 양방향 도로 m개의 교통량을 분석해서 예상 소요 시간을 실시간으로 계산합니다. +# 만약 어떤 도로의 길이가 L이고 교통량이 T라면 +# 해당 도로를 통과하는데 L + T분이 소요됩니다. (0 ≤ T) +# +# 제한사항 +# 2 ≤ n ≤ 50,000 +# 1번 지점이 출발지, n번 지점이 목적지입니다. +# n - 1 ≤ roads의 길이 = m ≤ 200,000 +# roads[i]는 i+1번 도로에 대한 정보를 담고 있으며 [U, V, L, T] 형태의 길이가 4인 1차원 정수 배열입니다. +# U번 지점과 V번 지점을 연결하는 길이 L, 교통량 T인 도로를 의미합니다. +# 1 ≤ U < V ≤ n +# 1 ≤ L ≤ 109 +# 0 ≤ T ≤ 109 +# 서로 다른 두 지점을 직접 연결하는 도로는 최대 1개입니다. +# 도로를 통해 한 지점에서 다른 지점으로 이동하는 방법이 항상 존재합니다. + diff --git "a/03122_Ji/2\354\243\274\354\260\250/kingQ_Ji.py" "b/03122_Ji/2\354\243\274\354\260\250/kingQ_Ji.py" new file mode 100644 index 0000000..5bc2197 --- /dev/null +++ "b/03122_Ji/2\354\243\274\354\260\250/kingQ_Ji.py" @@ -0,0 +1,95 @@ +# https://www.acmicpc.net/problem/1063 +# 8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. +# 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는 행을 상징한다. +# 열은 가장 왼쪽 열이 A이고, 가장 오른쪽 열이 H까지 이고, 행은 가장 아래가 1이고 가장 위가 8이다. +# 예를 들어, 왼쪽 아래 코너는 A1이고, 그 오른쪽 칸은 B1이다. + +# 킹은 다음과 같이 움직일 수 있다. + +# R : 한 칸 오른쪽으로 +# L : 한 칸 왼쪽으로 +# B : 한 칸 아래로 +# T : 한 칸 위로 +# RT : 오른쪽 위 대각선으로 +# LT : 왼쪽 위 대각선으로 +# RB : 오른쪽 아래 대각선으로 +# LB : 왼쪽 아래 대각선으로 +# 체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다. 아래 그림을 참고하자. +# 입력으로 킹이 어떻게 움직여야 하는지 주어진다. 입력으로 주어진 대로 움직여서 킹이나 돌이 체스판 밖으로 나갈 경우에는 그 이동은 건너 뛰고 다음 이동을 한다. +# 킹과 돌의 마지막 위치를 구하는 프로그램을 작성하시오. + +# 입력 +# 첫째 줄에 킹의 위치, 돌의 위치, 움직이는 횟수 N이 주어진다. 둘째 줄부터 N개의 줄에는 킹이 어떻게 움직여야 하는지 주어진다. N은 50보다 작거나 같은 자연수이고, 움직이는 정보는 위에 쓰여 있는 8가지 중 하나이다. + +# 출력 +# 첫째 줄에 킹의 마지막 위치, 둘째 줄에 돌의 마지막 위치를 출력한다. + +# R : 한 칸 오른쪽으로 +# L : 한 칸 왼쪽으로 +# B : 한 칸 아래로 +# T : 한 칸 위로 +# RT : 오른쪽 위 대각선으로 +# LT : 왼쪽 위 대각선으로 +# RB : 오른쪽 아래 대각선으로 +# LB : 왼쪽 아래 대각선으로 + +move = { + 'R':(1,0), + 'L':(-1,0), + 'B':(0,-1), + 'T':(0,1), + 'RT':(1,1), + 'LT':(-1,1), + 'RB':(1,-1), + 'LB':(-1,-1) +} +chessboard_n2a = {1:'A', 2:'B', 3:'C', 4:'D', 5:'E', 6:'F', 7:'G', 8:'H'} # 좌표 계산으로 움직인 후 체스 위치로 변환하기 위한 딕셔너리 +chessboard_a2n = {val:key for key, val in chessboard_n2a.items()} # 초기 위치를 받았을때 좌표로 변환하기 위한 딕셔너리리 + +class Chessmen: + ''' + 체스말 클래스 + ''' + def __init__(self, initial): # 초기 위치(문자열)를 받아서 숫자로 변환 후 리스트에 저장장 + self.now = [] + self.now.append(chessboard_a2n[initial[0]]) + self.now.append(int(initial[1])) + + def where(self): # 현재 위치 반환: 숫자 -> 문자자 + self.now_board = chessboard_n2a[self.now[0]] + str(self.now[1]) + return self.now_board + + def move(self, moving_cmd): # 체스말 이동 + for i in range(2): + self.now[i] += move[moving_cmd][i] + if self.now[i] > 8 or self.now[i] < 1: # 체스판의 범위를 넘으면 False 반환환 + return False + return True + + def move_back(self, moving_cmd): # 커맨드 반대로 되돌아가는 함수 + for i in range(2): + self.now[i] -= move[moving_cmd][i] + +first = input('킹의 위치, 돌의 위치, 움직이는 횟수를 입력하시오:').split() # 한줄에 입력받은 문자열을 나눠서 리스트에 저장장 + +king = Chessmen(first[0]) # king 객체 초기 위치(문자열) 주며 초기화화 +dol = Chessmen(first[1]) # dol 객체 초기 위치(문자열) 주며 초기화화 +n = int(first[2]) # 반복횟수 숫자로 저장장 + +def move_chessman(cmd): # 킹 이동 및 돌과 겹치면 돌 이동, 체스판을 넘어가면면 다시 원래 자리로 돌아가게 하는 함수 + king_next = king.move(cmd) # 킹 이동동 + if king_next == False: # 킹 이동이 체스판 범위를 넘음 + king.move_back(cmd) # 킹 움직임 번복 + elif king.now == dol.now: # 킹과 돌의 위치가 같다 + dol_next = dol.move(cmd) # 돌을 킹이 움직인 방향으로 움직임 + if dol_next == False: # 돌이 체스판 벗어남 + king.move_back(cmd) # 킹과 돌 원래 자리로 돌아감 + dol.move_back(cmd) + return + + +for i in range(n): # 입력받은 수만큼 킹 이동 함수 반복복 + moving_cmd = input() # 반복하는 횟수만큼 커맨드 입력받음 + move_chessman(moving_cmd) + +print(king.where(),dol.where()) diff --git "a/03122_Ji/2\354\243\274\354\260\250/study_2week_kimQ_Ji.py" "b/03122_Ji/2\354\243\274\354\260\250/study_2week_kimQ_Ji.py" new file mode 100644 index 0000000..1e8cfdd --- /dev/null +++ "b/03122_Ji/2\354\243\274\354\260\250/study_2week_kimQ_Ji.py" @@ -0,0 +1,30 @@ +# Q1. 로그인 시에 아이디를 검사하는 함수 check()를 작성해서 테스트하라. +# check가 한 번 호출 될 때마다 비밀번호를 질문하고 일치여부를 확인한다. +# 비밀번호는 숫자 1234로 고정되어있다고 가정한다. +# check가 3번 이상 호출되고 아이디가 일치하지 않으면 check()는 "Account has exceed allowed number of login attempts."메시지를 출력한다. + +def check(): + password = input('password: ') + if password == '1234': + return True + else: + return False + +for i in range(3): # check 호출 3번 반복 + result = check() + if result: # result == True + print('로그인 성공') + break + elif i==2: # result == False 고 i == 2(3번째 입력일 때) + print('Account has exceed allowed number of login attempts.') + + + +''' +Result + +password: 1000 +password: 1001 +password: 1002 +Account has exceed allowed number of login attempts. +''' \ No newline at end of file diff --git "a/03122_Ji/2\354\243\274\354\260\250/study_week2_Q_jwlee_Ji.py" "b/03122_Ji/2\354\243\274\354\260\250/study_week2_Q_jwlee_Ji.py" new file mode 100644 index 0000000..830585f --- /dev/null +++ "b/03122_Ji/2\354\243\274\354\260\250/study_week2_Q_jwlee_Ji.py" @@ -0,0 +1,38 @@ +# 문제 설명 +# 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. +# 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. +# 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요. + +# 제한 조건 +# x는 1 이상, 10000 이하인 정수입니다. + +# 입출력 예 +# x return +# 10 true +# 12 true +# 11 false +# 13 false + +# 입출력 예 설명 +# 입출력 예 #1 +# 10의 모든 자릿수의 합은 1입니다. 10은 1로 나누어 떨어지므로 10은 하샤드 수입니다. + +# 입출력 예 #2 +# 12의 모든 자릿수의 합은 3입니다. 12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다. + +# 입출력 예 #3 +# 11의 모든 자릿수의 합은 2입니다. 11은 2로 나누어 떨어지지 않으므로 11는 하샤드 수가 아닙니다. + + +# https://school.programmers.co.kr/learn/courses/30/lessons/12947 + +def solution(x): + str_x = str(x) + sum = 0 + for i in str_x: + sum += int(i) + if x % sum == 0: + answer = True + else: + answer = False + return answer \ No newline at end of file diff --git "a/03122_Ji/2\354\243\274\354\260\250/\353\254\270\354\240\234/study_week2_A_ji.py" "b/03122_Ji/2\354\243\274\354\260\250/\353\254\270\354\240\234/study_week2_A_ji.py" new file mode 100644 index 0000000..aaed121 --- /dev/null +++ "b/03122_Ji/2\354\243\274\354\260\250/\353\254\270\354\240\234/study_week2_A_ji.py" @@ -0,0 +1,28 @@ +# 문제 설명 +# 문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. +# 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다. + +# 제한 사항 +# s는 길이 1 이상, 길이 8 이하인 문자열입니다. +# s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다. + +# 입출력 예 +# s return +# "a234" false +# "1234" true + +def solution(s): + if len(s)==4 or len(s)==6: + for cha in s: + if 48<=ord(cha)<=57: + pass + else: + return False + return True + else: + return False + +s = 'a1234' +print(solution(s)) + +# if 문 층이 많을수록 안좋다 diff --git "a/03122_Ji/2\354\243\274\354\260\250/\353\254\270\354\240\234/study_week2_Q_ji.py" "b/03122_Ji/2\354\243\274\354\260\250/\353\254\270\354\240\234/study_week2_Q_ji.py" new file mode 100644 index 0000000..33601f1 --- /dev/null +++ "b/03122_Ji/2\354\243\274\354\260\250/\353\254\270\354\240\234/study_week2_Q_ji.py" @@ -0,0 +1,13 @@ +# 문제 설명 +# 문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다. + +# 제한 사항 +# s는 길이 1 이상, 길이 8 이하인 문자열입니다. +# s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다. + +# 입출력 예 +# s return +# "a234" false +# "1234" true + +# https://school.programmers.co.kr/learn/courses/30/lessons/12918 \ No newline at end of file diff --git "a/03122_Ji/3\354\243\274\354\260\250/QnA_Ji/study_week3_A_Ji.py" "b/03122_Ji/3\354\243\274\354\260\250/QnA_Ji/study_week3_A_Ji.py" new file mode 100644 index 0000000..1c4b900 --- /dev/null +++ "b/03122_Ji/3\354\243\274\354\260\250/QnA_Ji/study_week3_A_Ji.py" @@ -0,0 +1,61 @@ +# 1 +import re +numbers=['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'] + +def solution(s): + for idx, num in enumerate(numbers): # numbers 리스트와 인덱스를 같이 처리(0,1,2,3...) + p = re.compile(num) # numbers 요소를 비교로 설정정 + if p.search(s): # 문자열 처음부터 끝까지 검색해서 존재하면면 + s= s.replace(num,str(idx)) # 문자열에서 numbers요소 부분을을 그 인덱스를 문자열화 한것으로 대체 + return int(s) # '숫자'로 대체한한 문자열을 정수형으로 변환하여 반환환 + +s = 'one4seveneight' +print(solution(s)) + + +# 2. +from collections import deque + +def solution(s): + dq = deque(s) + count = 0 # 몇 개의 부분으로 분해되었는지 저장하는 변수수 + + while dq: + if len(dq) == 1: # 문자열이 처음부터 한글자거나, 한글자만 남았을 때 + count += 1 + + x = dq.popleft() # 첫번째 요소를 x에 저장(덱에서 삭제제) + count_x = 1 # x 개수를 저장할 변수 초기화 (처음 하나가 있으니 1) + count_a = 0 # x와 다른 문자 개수를 저장할 변수 초기화화 + + while dq: + if x == dq[0]: # 그 다음요소가 x와 같으면면 + count_x += 1 # x 개수 +1 + dq.popleft() # 그리고 검사한 요소는 삭제제 + else: + count_a += 1 # 그 다음요소가 x와 다르면면 a에 +1 + dq.popleft() # 그리고 검사한 요소 삭제 + + if count_x == count_a: # 검사 후 x와 다른문자의 개수가 같으면 + count += 1 # count 변수에 +1 하고 내부 반복문 탈출출 + break + elif len(dq) == 0: # 만약 개수가 다른데 문자열을 다 확인했다면 + count += 1 # count 변수에 +1 하여 한덩어리임을 저장장 + return count + +print(solution('bbbba')) + + +# 3 +def solution(s): + nums = s.split() # 공백을 기준으로 나눠 리스트로 저장장 + nums = list(map(lambda x: int(x), nums)) # 리스트 내부 문자열숫자를 정수로 변환환 + max_num = max(nums) + min_num = min(nums) + result_list = [min_num, max_num] # 최소값, 최대값을 차례대로 결과 리스트에 저장 + result_list = list(map(lambda x: str(x), result_list)) # 내부 요소를 문자열숫자로 변환 + result = " ".join(result_list) # 공백을 기준으로 하나의 문자열로 저장 + return result + +s = input('숫자를 입력하세요:') +print(solution(s)) diff --git "a/03122_Ji/3\354\243\274\354\260\250/QnA_Ji/study_week3_Q_Ji.py" "b/03122_Ji/3\354\243\274\354\260\250/QnA_Ji/study_week3_Q_Ji.py" new file mode 100644 index 0000000..5c23d3e --- /dev/null +++ "b/03122_Ji/3\354\243\274\354\260\250/QnA_Ji/study_week3_Q_Ji.py" @@ -0,0 +1,110 @@ +''' +총 3문제 +1. https://school.programmers.co.kr/learn/courses/30/lessons/81301 +2. https://school.programmers.co.kr/learn/courses/30/lessons/140108 +3. https://school.programmers.co.kr/learn/courses/30/lessons/12939 + +''' + +# 1. 문제 설명 +'''네오와 프로도가 숫자놀이를 하고 있습니다. +네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. +다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다. + +1478 → "one4seveneight" +234567 → "23four5six7" +10203 → "1zerotwozero3" + +이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요. +참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다. + +숫자 영단어 +0 zero +1 one +2 two +3 three +4 four +5 five +6 six +7 seven +8 eight +9 nine + +제한사항 +1 ≤ s의 길이 ≤ 50 +s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다. +return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다. + +입출력 예 +s result +"one4seveneight" 1478 +"23four5six7" 234567 +"2three45sixseven" 234567 +"123" 123 +입출력 예 설명 +입출력 예 #1 + +문제 예시와 같습니다. +입출력 예 #2 + +문제 예시와 같습니다. +입출력 예 #3 + +"three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다. +입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다. +입출력 예 #4 + +s에는 영단어로 바뀐 부분이 없습니다. + +제한시간 안내 +정확성 테스트 : 10초 +''' + +# 2. 문제 설명 +''' +문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다. + +- 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다. +- 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. + 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다. +- s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다. +- 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다. + +문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요. + +제한사항 +1 ≤ s의 길이 ≤ 10,000 +s는 영어 소문자로만 이루어져 있습니다. + +입출력 예 + s result +"banana" 3 +"abracadabra" 6 +"aaabbaccccabba" 3 + +입출력 예 설명 +입출력 예 #1 +s="banana"인 경우 ba - na - na와 같이 분해됩니다. + +입출력 예 #2 +s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다. + +입출력 예 #3 +s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다. +''' + +# 3. 문제 설명 +''' +문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. +str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요. +예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다. + +제한 조건 +s에는 둘 이상의 정수가 공백으로 구분되어 있습니다. + +입출력 예 +s return +"1 2 3 4" "1 4" +"-1 -2 -3 -4" "-4 -1" +"-1 -1" "-1 -1" +''' \ No newline at end of file diff --git "a/03122_Ji/3\354\243\274\354\260\250/pythonA_Ji.py" "b/03122_Ji/3\354\243\274\354\260\250/pythonA_Ji.py" new file mode 100644 index 0000000..a16057b --- /dev/null +++ "b/03122_Ji/3\354\243\274\354\260\250/pythonA_Ji.py" @@ -0,0 +1,92 @@ +# 1 +sum_num = lambda x,y: x+y +print(sum_num(3,5)) + +# 2 +numbers = [1, 2, 3, 4] +squared_numbers = list(map(lambda x: x ** 2,numbers)) +print(squared_numbers) + +# 3 +words = ["hello", "world"] +words_len = list(map(lambda x: len(x), words)) +print(words_len) + +# 4 +numbers = [1, 2, 3, 4, 5, 6] +even = list(filter(lambda x: x % 2 == 0, numbers)) +print(even) + +# 5 +from functools import reduce +numbers = [10, 20, 30, 40] +max_num = reduce(lambda x,y: x if x>y else y, numbers) +print(max_num) + +# 7 +words = ["banana", "apple", "cherry"] +print(sorted(words)) + +# 8 +numbers = [5, 10, 15, 20] +fn = list(filter(lambda x: x>=10, numbers)) +print(fn) + +# 9 +words = ["python", "lambda"] +cwords = list(map(lambda x: x.upper(), words)) +print(cwords) + +# 10 +numbers = [4, 9, 16] +sr = list(map(lambda x: x ** 0.5, numbers)) +print(sr) + +# 11 +words = ["hello", "world"] +w_words = list(filter(lambda x: 'w' in x, words)) +print(w_words) + +# 12 +numbers = [1, 2, 3, 4] +multi_num = reduce(lambda x,y: x*y, numbers) +print(multi_num) + +# 13 +numbers = [1, 2, 3, 4, 5] +even = [x**2 for x in numbers if x%2 ==0] +print(even) + +# 14 +list1 = [1, 2, 3] +list2 = [4, 5, 6] +hap = list(map(lambda x,y: x+y, list1, list2)) +print(hap) + +# 15 +people = [("Alice", 30), ("Bob", 25), ("Charlie", 35)] +people.sort(key=lambda x:x[1]) +print(people) + +# 16 +plus_str = lambda str1,str2: str1+' '+str2 +print(plus_str('hello','world')) + +# 17 +numbers = [1, 2, 3, 4, 5, 6] +even = list(filter(lambda x:x%2==0,numbers)) +sum_even = sum(even) +print(sum_even) + +# 18 +words = ["apple", "banana"] +fw = list(map(lambda x: x[0], words)) +print(fw) + +# 19 +numbers = [1, 2, 3] +print(list(map(lambda x:str(x),numbers))) + +# 20 +words = ["python", "is", "awesome"] +print(list(filter(lambda x: len(x)>=3, words))) \ No newline at end of file diff --git "a/03122_Ji/3\354\243\274\354\260\250/pythonQ.md" "b/03122_Ji/3\354\243\274\354\260\250/pythonQ.md" new file mode 100644 index 0000000..11367f3 --- /dev/null +++ "b/03122_Ji/3\354\243\274\354\260\250/pythonQ.md" @@ -0,0 +1,132 @@ +# Python 기초 심화 문제 모음 + +아래는 Python의 lambda에 관련된된 20개씩의 문제를 구성하였습니다. + +--- + +## 람다 함수 문제 + +### 1. 두 숫자를 더하는 람다 함수 작성하기 +```python +# 입력: (3, 5) +# 출력: 8 +``` + +### 2. 리스트의 각 요소를 제곱하는 람다 함수 사용 +```python +numbers = [1, 2, 3, 4] +# 출력: [1, 4, 9, 16] +``` + +### 3. 문자열 길이를 반환하는 람다 함수 작성 +```python +words = ["hello", "world"] +# 출력: [5, 5] +``` + +### 4. 짝수 필터링 +```python +numbers = [1, 2, 3, 4, 5, 6] +# 출력: [2, 4, 6] +``` + +### 5. 리스트의 최대값 찾기 +```python +numbers = [10, 20, 30, 40] +# 출력: 40 +``` + +### 6. 단어를 알파벳 순서로 정렬하기 +```python +words = ["banana", "apple", "cherry"] +# 출력: ["apple", "banana", "cherry"] +``` + +### 7. 리스트의 요소를 두 배로 만드는 람다 함수 +```python +numbers = [1, 2, 3] +# 출력: [2, 4, 6] +``` + +### 8. 특정 조건에 따라 값 필터링 +```python +numbers = [5, 10, 15, 20] +# 조건: 10 이상인 숫자만 +# 출력: [10, 15, 20] +``` + +### 9. 문자열 리스트를 대문자로 변환 +```python +words = ["python", "lambda"] +# 출력: ["PYTHON", "LAMBDA"] +``` + +### 10. 람다와 map을 사용해 리스트의 제곱근 계산 +```python +numbers = [4, 9, 16] +# 출력: [2.0, 3.0, 4.0] +``` + +### 11. 리스트 내 특정 단어 포함 여부 확인 +```python +words = ["hello", "world"] +# 조건: 'w'가 포함된 단어 +# 출력: ["world"] +``` + +### 12. 람다와 reduce를 사용해 리스트의 곱 계산 +```python +numbers = [1, 2, 3, 4] +# 출력: 24 +``` + +### 13. 리스트의 짝수 요소를 제곱 +```python +numbers = [1, 2, 3, 4, 5] +# 출력: [4, 16] +``` + +### 14. 두 리스트의 합 생성 +```python +list1 = [1, 2, 3] +list2 = [4, 5, 6] +# 출력: [5, 7, 9] +``` + +### 15. 이름과 나이를 튜플로 정렬 +```python +people = [("Alice", 30), ("Bob", 25), ("Charlie", 35)] +# 나이 순으로 정렬 +# 출력: [("Bob", 25), ("Alice", 30), ("Charlie", 35)] +``` + +### 16. 두 문자열을 결합하는 람다 함수 작성 +```python +# 입력: ("hello", "world") +# 출력: "hello world" +``` + +### 17. 리스트에서 짝수의 합 계산 +```python +numbers = [1, 2, 3, 4, 5, 6] +# 출력: 12 +``` + +### 18. 문자열의 첫 글자를 반환 +```python +words = ["apple", "banana"] +# 출력: ["a", "b"] +``` + +### 19. 리스트의 요소를 문자열로 변환 +```python +numbers = [1, 2, 3] +# 출력: ["1", "2", "3"] +``` + +### 20. 특정 길이 이상의 단어 필터링 +```python +words = ["python", "is", "awesome"] +# 조건: 길이 3 이상 +# 출력: ["python", "awesome"] +``` diff --git "a/03122_Ji/3\354\243\274\354\260\250/study_3week_kimA_Ji.py" "b/03122_Ji/3\354\243\274\354\260\250/study_3week_kimA_Ji.py" new file mode 100644 index 0000000..563c4cb --- /dev/null +++ "b/03122_Ji/3\354\243\274\354\260\250/study_3week_kimA_Ji.py" @@ -0,0 +1,51 @@ +# 음료 주문 프로그램 + +# menu={'coffee':3500,'latte':4000,'smoothie':5000,'tea':3000} + +# 해당 딕셔너리를 활용하여 음료 주문을 하는 GUI프로그램을 생성한다. +# 창 제목은 음료 주문 프로그램이라고 작성한다. +# exit버튼을 누르면 터미널에 음료 주문 프로그램을 종료했다는 문구와 함께 프로그램 창을 종료시킨다. +# 창에는 메뉴판에 있는 메뉴명을 기재하며 각 메뉴 버튼을 누르면 하단에 총 금액과 총 가격에 반영되도록 이벤트를 설정한다. +from tkinter import Tk +from tkinter import Button +from tkinter import Label + +menu={'coffee':3500,'latte':4000,'smoothie':5000,'tea':3000} +menu_list = list(menu.keys()) +sum = 0 + +def event(key): + global sum + sum += menu[key] + + olabel3 = Label(otk, text=f'{key}: {menu[key]}원') + olabel3.pack() + olabel4['text']=f'총 {sum}원' + +otk = Tk() +otk.title('음료 주문 프로그램') +otk.geometry('300x300+200+200') + +exitbotton = Button(otk, text='exit',command=exit) +exitbotton.pack(side='bottom') + +olabel1 = Label(otk, text='') +olabel1.pack(side='top') + +obtn1 = Button(otk, text=menu_list[0], width=10 ,command=lambda: event(menu_list[0])) +obtn2 = Button(otk, text=menu_list[1], width=10 ,command=lambda: event(menu_list[1])) +obtn3 = Button(otk, text=menu_list[2], width=10 ,command=lambda: event(menu_list[2])) +obtn4 = Button(otk, text=menu_list[3], width=10 ,command=lambda: event(menu_list[3])) + +obtn1.pack() +obtn2.pack() +obtn3.pack() +obtn4.pack() + +olabel2 = Label(otk, text='주문내역') +olabel4 = Label(otk, text=f'총 {sum}원') + +olabel2.pack() +olabel4.pack(side='bottom') + +otk.mainloop() \ No newline at end of file diff --git "a/03122_Ji/3\354\243\274\354\260\250/study_week3_Q_jwlee.py" "b/03122_Ji/3\354\243\274\354\260\250/study_week3_Q_jwlee.py" new file mode 100644 index 0000000..8b53296 --- /dev/null +++ "b/03122_Ji/3\354\243\274\354\260\250/study_week3_Q_jwlee.py" @@ -0,0 +1,23 @@ +# 1번 - lambda와 map 함수 활용 + +# 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. +# 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요. + +# 제한 조건 +# 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다. +# 입출력 예 +# arr1 arr2 return +# [[1,2],[2,3]] [[3,4],[5,6]] [[4,6],[7,9]] +# [[1],[2]] [[3],[4]] [[4],[6]] + +def solution(arr1,arr2): + answer = [] + for i in range(len(arr1)): + add_arr = list(map(lambda x,y: x+y,arr1[i],arr2[i])) + answer.append(add_arr) + return answer + +arr1 = [[1,2,3],[2,3,4]] +arr2 = [[1,2,3],[2,3,4]] +print(solution(arr1,arr2)) + diff --git "a/03122_Ji/3\354\243\274\354\260\250/study_week_3_Q_seok.py" "b/03122_Ji/3\354\243\274\354\260\250/study_week_3_Q_seok.py" new file mode 100644 index 0000000..757c411 --- /dev/null +++ "b/03122_Ji/3\354\243\274\354\260\250/study_week_3_Q_seok.py" @@ -0,0 +1,60 @@ +# https://school.programmers.co.kr/learn/courses/30/lessons/42583 +''' +문제 설명 +트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. +다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다. + +예를 들어, 트럭 2대가 올라갈 수 있고 무게를 10kg까지 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다. + + +경과 시간 다리를 지난 트럭 다리를 건너는 트럭 대기 트럭 +0 [] [] [7,4,5,6] +1 [] [7] [4,5,6] +2~3 [7] [] [4,5,6] +4 [7] [4,5] [6] +5 [7,4] [5] [6] +6~7 [7,4,5] [6] [] +8 [7,4,5,6] [] [] + +따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다. + +solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭 별 무게 truck_weights가 주어집니다. +이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요. + +제한 조건 +- bridge_length는 1 이상 10,000 이하입니다. +- weight는 1 이상 10,000 이하입니다. +- truck_weights의 길이는 1 이상 10,000 이하입니다. +- 모든 트럭의 무게는 1 이상 weight 이하입니다. + +입출력 예 +bridge_length weight truck_weights return +2 10 [7,4,5,6] 8 +100 100 [10] 101 +100 100 [10,10,10,10,10,10,10,10,10,10] 110 +''' +#------------------------------------------------------------------------------------------------------------------------------------------------------------------ +''' +예제분석 +- bridge_length 대의 트럭이 다리에 올라 갈 수 있다. +- 즉, 한 대의 트럭이 다리를 건널시 bridge_length 초 만큼 시간이 소요된다. +- weight 이하까지 제한이 있어 truck_weights가 weight을 초과할시 해당 트럭은 다리에 올라 갈 수 없다. +- 위에 있는 예제의 조건에 따르면 + bridge_length : 2 + weight : 10 + truck_weights : [7, 4, 5, 6] + +시간 다리 위 상태 (길이 = 2) 대기 트럭 합계 무게 +0초 [0, 0] [7, 4, 5, 6] 0 +1초 [0, 7] [4, 5, 6] 7 +2초 [7, 0] [4, 5, 6] 7 +3초 [0, 4] [5, 6] 4 +4초 [4, 5] [6] 9 +5초 [5, 0] [6] 5 +6초 [0, 6] [] 6 +7초 [6, 0] [] 6 +8초 [0, 0] [] 0 + +8초가 소요된 모습이고, FIFO 특성의 큐를 활용하면 풀 수 있을 것이다. + +''' \ No newline at end of file diff --git "a/03122_Ji/4\354\243\274\354\260\250/QnA_Ji/study_week4_Ji_A.py" "b/03122_Ji/4\354\243\274\354\260\250/QnA_Ji/study_week4_Ji_A.py" new file mode 100644 index 0000000..c09434a --- /dev/null +++ "b/03122_Ji/4\354\243\274\354\260\250/QnA_Ji/study_week4_Ji_A.py" @@ -0,0 +1,19 @@ +# 1 +def solution(order): + num_list = str(order) + answer = 0 + for num in num_list: + if num in '369': + answer += 1 + print(answer) + return answer + +# 2 sub 으로 하는 방법 +def solution(phone_number): + phone_number = list(phone_number) + for idx in range(len(phone_number[:-4])): + phone_number[idx] = '*' + answer = ''.join(phone_number) + return answer + +print(solution('01064289769')) \ No newline at end of file diff --git "a/03122_Ji/4\354\243\274\354\260\250/QnA_Ji/study_week4_Ji_Q.py" "b/03122_Ji/4\354\243\274\354\260\250/QnA_Ji/study_week4_Ji_Q.py" new file mode 100644 index 0000000..818d863 --- /dev/null +++ "b/03122_Ji/4\354\243\274\354\260\250/QnA_Ji/study_week4_Ji_Q.py" @@ -0,0 +1,38 @@ +# 1. https://school.programmers.co.kr/learn/courses/30/lessons/120891 +''' +문제 설명 +머쓱이는 친구들과 369게임을 하고 있습니다. +369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 +숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. +머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, +머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요. + +제한사항 +1 ≤ order ≤ 1,000,000 +입출력 예 +order result +3 1 +29423 2 +입출력 예 설명 +입출력 예 #1 + +3은 3이 1개 있으므로 1을 출력합니다. +입출력 예 #2 + +29423은 3이 1개, 9가 1개 있으므로 2를 출력합니다. +''' + + +# 2. https://school.programmers.co.kr/learn/courses/30/lessons/12948 +''' +문제 설명 +프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다. +전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요. + +제한 조건 +phone_number는 길이 4 이상, 20이하인 문자열입니다. +입출력 예 +phone_number return +"01033334444" "*******4444" +"027778888" "*****8888" +''' \ No newline at end of file diff --git "a/03122_Ji/4\354\243\274\354\260\250/python_A_Ji.py" "b/03122_Ji/4\354\243\274\354\260\250/python_A_Ji.py" new file mode 100644 index 0000000..4d36a8b --- /dev/null +++ "b/03122_Ji/4\354\243\274\354\260\250/python_A_Ji.py" @@ -0,0 +1,200 @@ +''' +내장 함수 문제 +''' + +# 1 +print(f'1: {abs(-5)}') + +# 2 전부 true +numbers = [True, True, False] +print(f'2: {all(numbers)}') # 리스트에 숫자 0있으면 False,'':False? + +# 3 +numbers = [0, 0, 1] +print(f'3: {any(numbers)}') + +# 4 +words = ["a", "b", "c"] +print(f'4: {list(enumerate(words))}') + +# 5 +numbers = [1, 2, 3, 4, 5] +print(f'5: {list(filter(lambda x:x%2==0,numbers))}') + +# 6 +numbers = [1, 2, 3] +print(f'6: {len(numbers)}') + +# 7 +numbers = [10, 20, 30] +print(f'7: {max(numbers)}') + +# 8 +numbers = [10, 20, 30] +print(f'8: {min(numbers)}') + +# 9 +numbers = [1, 2, 3] +print(f'9: {list(map(lambda x: x ** 2, numbers))}') + +# 10 +print(f'10: {pow(2,3)}') + +# 11 +print(f'11: {list(range(5))}') + +# 12 +numbers = [1, 2, 3] +print(f'12: {reversed(numbers)}') + +# 13 +print(f'13: {round(3.14159, 2)}') + +# 14 +numbers = [3, 1, 2] +print(f'14: {sorted(numbers)}') + +# 15 +numbers = [1, 2, 3] +print(f'15: {sum(numbers)}') + +# 16 +value = 42 +print(f'16: {type(value)}') + +# 17 ## zip 으로 묶어서 딕셔너리 만들 수 있음 +list1 = [1, 2, 3] +list2 = ["a", "b", "c"] +print(f'17: {list(zip(list1,list2))}') + +# 18 +expression = "2 + 3 * 4" +print(f'18: {eval(expression)}') + +# 19 +print(f'19: {chr(97)}') + +# 20 +print(f'20: {ord('a')}') + + +''' +정규 표현식 문제 +''' +print('-----정규 표현식 문제-----') +# 1 +import re +text = "Contact us at info@example.com or support@domain.org" +p = re.compile('\w+@\w+[.]\w+') +s = p.findall(text) +print(f'1: {s}') + +# 2 +text = "apple banana cherry date" +pattern = r"^a" +p = re.compile('^a\w+') +s = p.findall(text) +print(f'2: {s}') + +# 3 +phone = "123-456-7890" +p = re.compile('\d{3}-\d{3}-\d{4}') +s = p.match(phone) +print(f'3: {bool(s)}') + +# 4 +text = "Order 123 items for $45.67" +p = re.compile('\d+') +s = p.findall(text) +print(f'4: {s}') + +# 5 +text = "This is a test sentence." +p = re.compile('\s') +s = len(p.findall(text)) + 1 +print(f'5: {s}') + +# 6 +html = "

This is a paragraph.

" +p = re.compile('') +s = p.findall(html) +for char in s: + html=html.replace(char, '') +print(f'6: {html}') + +# 7 +text = "Python is fun" +word = "fun" +p = re.compile(text) +s = p.search(text) +print(f'7: {bool(s)}') + +# 8 sub (괄호 안에 있으면 인덱스로) +date = "2025-01-27" + +# 9 lambda +text = "Hello World" + +# 10 +ip = "192.168.1.1" +p = re.compile('\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}') +s = p.match(ip) +print(f'10: {bool(s)}') + +# 11 +text = "Visit https://example.com or http://test.org for info." +p = re.compile('https?://[a-zA-z0-9.-]+[.]\w+') +s = p.findall(text) +print(s) + +# 12 +text = "I love cats and dogs" +pattern = r"cats" +replacement = "pets" +result = re.sub(pattern, replacement,text) +print(f'12: {result}') + +# 13 +text = "This is a test." +result=re.sub(' +',' ',text) +print(f'13: {result}') + +# 14 +path = "/user/home/test.txt" + +# 15 +text = "123abc!@#def456" +p = re.compile('[a-zA-Z]+') +s = p.findall(text) +print(f'15: {s}') + +# 16 +text = "running swimming jumping" +pattern = r"ing" +p = re.compile('\w+ing') +s = p.findall(text) +print(f'16: {s}') + +# 17 ## sub +text = "this this is is a test test" + + +# 18 +text = "Hello!@#$%^&*()" +p = re.compile('\w+') +s = p.match(text) +print(f'18: {s.group()}') + +# 19 +text = "cat bat mat" +length = 3 +p = re.compile(r'\b\w{3}\b') +s = p.findall(text) +print(f'19: {s}') + +# 20 +filename = "document.pdf" +p = re.compile('\w+[.]') +s = p.match(filename).group() +filename = filename.replace(s,'') +print(f'20: {filename}') \ No newline at end of file diff --git "a/03122_Ji/4\354\243\274\354\260\250/python_Q.md" "b/03122_Ji/4\354\243\274\354\260\250/python_Q.md" new file mode 100644 index 0000000..9239c78 --- /dev/null +++ "b/03122_Ji/4\354\243\274\354\260\250/python_Q.md" @@ -0,0 +1,249 @@ +## 내장 함수 문제 + +### 1. abs 함수 사용하기 +```python +# 입력: -5 +# 출력: 5 +``` + +### 2. all 함수로 리스트 검사하기 +```python +numbers = [True, True, False] +# 출력: False +``` + +### 3. any 함수로 값 존재 여부 확인 +```python +numbers = [0, 0, 1] +# 출력: True +``` + +### 4. enumerate 함수로 인덱스와 값 출력 +```python +words = ["a", "b", "c"] +# 출력: [(0, "a"), (1, "b"), (2, "c")] +``` + +### 5. filter 함수로 짝수 필터링 +```python +numbers = [1, 2, 3, 4, 5] +# 출력: [2, 4] +``` + +### 6. len 함수로 리스트 길이 확인 +```python +numbers = [1, 2, 3] +# 출력: 3 +``` + +### 7. max 함수로 최대값 찾기 +```python +numbers = [10, 20, 30] +# 출력: 30 +``` + +### 8. min 함수로 최소값 찾기 +```python +numbers = [10, 20, 30] +# 출력: 10 +``` + +### 9. map 함수로 리스트 요소 제곱 +```python +numbers = [1, 2, 3] +# 출력: [1, 4, 9] +``` + +### 10. pow 함수로 제곱 계산 +```python +# 입력: 2, 3 +# 출력: 8 +``` + +### 11. range 함수로 숫자 생성 +```python +# 입력: range(5) +# 출력: [0, 1, 2, 3, 4] +``` + +### 12. reversed 함수로 리스트 뒤집기 +```python +numbers = [1, 2, 3] +# 출력: [3, 2, 1] +``` + +### 13. round 함수로 소수점 반올림 +```python +# 입력: 3.14159, 2 +# 출력: 3.14 +``` + +### 14. sorted 함수로 정렬하기 +```python +numbers = [3, 1, 2] +# 출력: [1, 2, 3] +``` + +### 15. sum 함수로 리스트 합 계산 +```python +numbers = [1, 2, 3] +# 출력: 6 +``` + +### 16. type 함수로 데이터 타입 확인 +```python +value = 42 +# 출력: +``` + +### 17. zip 함수로 리스트 병합 +```python +list1 = [1, 2, 3] +list2 = ["a", "b", "c"] +# 출력: [(1, "a"), (2, "b"), (3, "c")] +``` + +### 18. eval 함수로 문자열 표현식 계산 +```python +expression = "2 + 3 * 4" +# 출력: 14 +``` + +### 19. chr 함수로 아스키 코드 문자 반환 +```python +# 입력: 97 +# 출력: 'a' +``` + +### 20. ord 함수로 문자 아스키 코드 반환 +```python +# 입력: 'a' +# 출력: 97 +``` +## 정규 표현식 문제 + +### 1. 문자열에서 모든 이메일 주소 찾기 +```python +text = "Contact us at info@example.com or support@domain.org" +# 출력: ['info@example.com', 'support@domain.org'] +``` + +### 2. 특정 패턴으로 시작하는 단어 추출 +```python +text = "apple banana cherry date" +pattern = r"^a" +# 출력: ['apple'] +``` + +### 3. 전화번호 형식 검사 +```python +phone = "123-456-7890" +# 출력: True (형식이 올바른 경우) +``` + +### 4. 문자열에서 숫자만 추출 +```python +text = "Order 123 items for $45.67" +# 출력: ['123', '45', '67'] +``` + +### 5. 공백으로 구분된 단어의 개수 세기 +```python +text = "This is a test sentence." +# 출력: 5 +``` + +### 6. HTML 태그 제거하기 +```python +html = "

This is a paragraph.

" +# 출력: 'This is a paragraph.' +``` + +### 7. 특정 단어 포함 여부 확인 +```python +text = "Python is fun" +word = "fun" +# 출력: True +``` + +### 8. 날짜 형식 변환 +```python +date = "2025-01-27" +# 출력: '27-01-2025' +``` + +### 9. 소문자와 대문자 교체 +```python +text = "Hello World" +# 출력: 'hELLO wORLD' +``` + +### 10. IP 주소 형식 검사 +```python +ip = "192.168.1.1" +# 출력: True (형식이 올바른 경우) +``` + +### 11. 문자열에서 모든 URL 추출 +```python +text = "Visit https://example.com or http://test.org for info." +# 출력: ['https://example.com', 'http://test.org'] +``` + +### 12. 특정 패턴의 단어 치환 +```python +text = "I love cats and dogs" +pattern = r"cats" +replacement = "pets" +# 출력: 'I love pets and dogs' +``` + +### 13. 문자열에서 연속된 공백 제거 +```python +text = "This is a test." +# 출력: 'This is a test.' +``` + +### 14. 특정 문자열이 파일 경로인지 검사 +```python +path = "/user/home/test.txt" +# 출력: True (파일 경로가 올바른 경우) +``` + +### 15. 영어 단어만 추출하기 +```python +text = "123abc!@#def456" +# 출력: ['abc', 'def'] +``` + +### 16. 특정 접미사로 끝나는 단어 찾기 +```python +text = "running swimming jumping" +pattern = r"ing" +# 출력: ['running', 'swimming', 'jumping'] +``` + +### 17. 문자열에서 중복된 단어 제거 +```python +text = "this this is is a test test" +# 출력: 'this is a test' +``` + +### 18. 문자열에서 특수 문자 제거 +```python +text = "Hello!@#$%^&*()" +# 출력: 'Hello' +``` + +### 19. 특정 길이의 단어만 추출 +```python +text = "cat bat mat" +length = 3 +# 출력: ['cat', 'bat', 'mat'] +``` + +### 20. 파일 확장자 추출 +```python +filename = "document.pdf" +# 출력: 'pdf' +``` \ No newline at end of file diff --git "a/03122_Ji/4\354\243\274\354\260\250/sketch.py" "b/03122_Ji/4\354\243\274\354\260\250/sketch.py" new file mode 100644 index 0000000..670c5a3 --- /dev/null +++ "b/03122_Ji/4\354\243\274\354\260\250/sketch.py" @@ -0,0 +1,101 @@ + +Nlist =[4,1,2,1] +N = len(Nlist) +class Node: + def __init__(self,item): + self.item = item + self.left = None + self.right = None + + def __repr__(self): + return str(self.item) + +class BinaryTree: + def __init__(self): + self.root = None + + +def make_itemlist(nums): + nums.insert(0,0) + item_list = [] + + for i,num in enumerate(nums): + for j in range(2**i): + if j % 2 != 0: + item_list.append(-num) + else: + item_list.append(num) + return item_list + +item_list =make_itemlist(Nlist) + +def make_Nodelist(itemlist): + node_list = [] + for i in itemlist: + node_list.append(Node(i)) + return node_list + +node_list = make_Nodelist(item_list) +# print(node_list[1].item) + +def make_Tree(Node_list): + global N + tree = BinaryTree() + tree.root= Node_list[0] + for i,node in enumerate(Node_list[0:-(2**N)]): + node.left = Node_list[2*i+1] + node.right = Node_list[2*i+2] + return tree + +tree = make_Tree(node_list) +# print(tree.root.left) + + +# def find_Target(node): +# if node.left.item == None: +# if sum(answer) == target_num: +# answer_list.append(answer) +# return + +# answer.append(node.left.item) +# find_Target(node.left.item) +# answer.pop() + +# answer.append(node.right.item) +# find_Target(node.right.item) +# answer.pop() + +target_num = 3 # 원하는 타겟 값 +answer_count = 0 # 타겟을 만족하는 경우의 수를 저장할 변수 + +def find_Target(node, current_sum=0): + global answer_count + + if node is None: + return + + # 현재 노드의 값을 더함 + current_sum += node.item + + # 리프 노드에 도달했을 때, 합이 target_num이면 경우의 수 증가 + if node.left is None and node.right is None: + if current_sum == target_num: + answer_count += 1 + return # 리프 노드에서는 더 이상 탐색할 필요 없음 + + # 왼쪽, 오른쪽 자식 노드로 탐색 진행 + find_Target(node.left, current_sum) + find_Target(node.right, current_sum) + +# DFS 실행 (트리의 루트부터 시작) +find_Target(tree.root) + +# 결과 출력 +print(answer_count) + + +# 어? 너무 비효율적임... + +# 팀원들 코드 확인해보기 + +# 문제 그대로 구현하기 보다 쉽게 하는 방법을 찾아 \ No newline at end of file diff --git "a/03122_Ji/4\354\243\274\354\260\250/study_kim_4week_A_Ji.py" "b/03122_Ji/4\354\243\274\354\260\250/study_kim_4week_A_Ji.py" new file mode 100644 index 0000000..5379881 --- /dev/null +++ "b/03122_Ji/4\354\243\274\354\260\250/study_kim_4week_A_Ji.py" @@ -0,0 +1,45 @@ +# N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. + +# 이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다. + +# 예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 남는 카드는 4가 된다. + +# N이 주어졌을 때, 제일 마지막에 남게 되는 카드를 구하는 프로그램을 작성하시오. + +# 입력 +# 첫째 줄에 정수 N(1 ≤ N ≤ 500,000)이 주어진다. + +# 출력 +# 첫째 줄에 남게 되는 카드의 번호를 출력한다. + +# https://www.acmicpc.net/problem/2164 + +from collections import deque + + +# def cardgame(N): +# cardlist = list(range(1,N+1)) +# queue = deque(cardlist) + +# while (queue) > 1: +# queue.popleft() +# queue.append(queue.popleft) + +# final_card = queue.pop() +# return final_card + +# N = int(input('카드 번호 입력:')) +# result = (cardgame(N)) +# print(result) + +N = int(input()) + +cardlist = list(range(1,N+1)) +queue = deque(cardlist) + +while len(queue) > 1: + queue.popleft() + queue.append(queue.popleft()) + +final_card = queue.pop() +print(final_card) \ No newline at end of file diff --git "a/03122_Ji/4\354\243\274\354\260\250/study_week4_A_jwlee_Ji.py" "b/03122_Ji/4\354\243\274\354\260\250/study_week4_A_jwlee_Ji.py" new file mode 100644 index 0000000..9d43407 --- /dev/null +++ "b/03122_Ji/4\354\243\274\354\260\250/study_week4_A_jwlee_Ji.py" @@ -0,0 +1,32 @@ +# 배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. +# 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. +# 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. + +# 예를 들면, +# arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다. +# arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다. +# 배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요. + +# 제한사항 +# 배열 arr의 크기 : 1,000,000 이하의 자연수 +# 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수 + +# 입출력 예 +# arr answer +# [1,1,3,3,0,1,1] [1,3,0,1] +# [4,4,4,3,3] [4,3] + +def solution(arr): + answer = [arr[0]] + + for num in arr[1:]: + n = answer.pop() + if n != num: + answer.extend([n,num]) + else: + answer.append(n) + + return answer + +arr=[1,1,3,3,0,1,1] +print(solution(arr)) diff --git "a/03122_Ji/4\354\243\274\354\260\250/study_week_4_Q_seok.py" "b/03122_Ji/4\354\243\274\354\260\250/study_week_4_Q_seok.py" new file mode 100644 index 0000000..bffa82a --- /dev/null +++ "b/03122_Ji/4\354\243\274\354\260\250/study_week_4_Q_seok.py" @@ -0,0 +1,165 @@ +# https://school.programmers.co.kr/learn/courses/30/lessons/43165 +'''0 +문제 설명 +n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. + +-1+1+1+1+1 = 3 ++1-1+1+1+1 = 3 ++1+1-1+1+1 = 3 ++1+1+1-1+1 = 3 ++1+1+1+1-1 = 3 + +사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요. + +제한사항 + - 주어지는 숫자의 개수는 2개 이상 20개 이하입니다. + - 각 숫자는 1 이상 50 이하인 자연수입니다. + - 타겟 넘버는 1 이상 1000 이하인 자연수입니다. + +입출력 예 + numbers target return + [1, 1, 1, 1, 1] 3 5 + [4, 1, 2, 1] 4 2 + +입출력 예 설명 + +입출력 예 #1 + - 문제 예시와 같습니다. + +입출력 예 #2 + +4+1-2+1 = 4 + +4-1+2-1 = 4 + 총 2가지 방법이 있으므로, 2를 return 합니다. +''' +#------------------------------------------------------------------------------------------------------------------------------------------------------------------ +''' +예제분석 + - 위의 예제 중 두번째 [4, 1, 2, 1]의 정수들을 더하거나 뺏을 때 분기점이 나뉩니다. + - 이걸 이진트리로 표현하면 다음과 같습니다. (왼쪽은 덧셈, 오른쪽은 뺄셈으로 가정합니다.) + + 0 + / \ + / \ + / \ + / \ + / \ + / \ + / \ + / \ + / \ + / \ + / \ + +4 -4 + / \ / \ + / \ / \ + / \ / \ + / \ / \ + +1 -1 +1 -1 + / \ / \ / \ / \ + +2 -2 +2 -2 +2 -2 +2 -2 + /\ /\ /\ /\ /\ /\ /\ /\ ++1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 + + - 이를 계산하면 + + 0 + / \ + / \ + / \ + / \ + / \ + / \ + / \ + / \ + / \ + / \ + / \ + 4 -4 + / \ / \ + / \ / \ + / \ / \ + / \ / \ + 5 3 -3 -5 + / \ / \ / \ / \ + 7 3 5 1 -1 -5 -3 -7 + /\ /\ /\ /\ /\ /\ /\ /\ + 8 6 4 2 6 4 2 0 0 -2 -4 -6 -2 -4 -6 -8 + + - [4, 1, 2, 1]... 모든 정수를 소모하였을때, 4가 나오는 경우의 수가 2가지임을 알 수 있습니다. +''' + +# 1. 정수 리스트를 받는다 +# 예시 [5,9,7,2,6] + +# 2. 딕셔너리로 처리할수 없을것같음.. +# [ +# 0: n , -n +# n: 0,a,-a +# -n:0,a,-a +# a:n,b,-b +# -a:n,b,-b +# b:a, +# ] + +# 3. 파이썬 이진트리 구현법 +# - 노드 클래스 생성 +# - 각 노드 생성 +# - 트리 클래스 생성 +# - 노드를 트리클래스로 엮는다 + +# 4. 노드로 만들 데이터 처리(item list 생성성) +# 예시 [5,9,7,2,6] 여기에 0추가 [0,5,9,7,2,6] +# 차례대로 트리를 만들려면 0 5 -5 9 -9 9 -9 ... +# 이런식으로 일단 만들음 +# 입력 Nlist = 어쩌구구 +# for i,num in enumerate(Nlist): +# for j in 2*i: +# if j % 2 != 0: +# node_list.append(-num) +# else: +# node_list.append(num) + +# 5. 노드 클래스 생성 +# class Node: +# def __init__(self,item): +# self.item = item +# self.left = None +# self.right = None + + +# 6. 아이템 리스트를 각 노드로 만들어 노드 리스트 생성성 +# def make_Nodelist(itemlist): +# node_list = [] +# for i in itemlist: +# node_list.append(i) +# return node_list + +# 7. 트리 클래스 +# class BinaryTree: +# def __init__(self): +# self.root = None + +# 8. 노드를 트리 클래스로 엮는다 +# tree = BinaryTree() +# tree.root = n0 +# n0.left = n1 +# n0.right = n2 +# n1.left = n3 +# n1.right = n4 +# ... + +# def make_Tree(Node_list): +# tree = BinaryTree() +# tree.root(Node_list[0]) +# for i,node in enumerate(Node_list[0:-(2**(N-1))]): +# node.left = Node_list[2*i+1] +# node.right = Node_list[2*i+2] +# return tree + +# 9. 타겟 넘버 탐색 +# -1 루트에서 left 부터 끝까지 탐색 +# -2 (지나온 숫자들 리스트에 저장)자식 노드가 없는 경우 멈추고 지나온 숫자들 합 +# -3 타겟넘버랑 같으면 리스트 통째로 정답 리스트에 저장 +# -4 지나온 숫자들 리스트에서 마지막 숫자 없애기 +# -5 전 레벨로 올라가서 right 노드 들어간후 2 반복 + diff --git "a/03122_Ji/5\354\243\274\354\260\250/QnA_Ji/study_week5_Ji_A.py" "b/03122_Ji/5\354\243\274\354\260\250/QnA_Ji/study_week5_Ji_A.py" new file mode 100644 index 0000000..f85f7d4 --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/QnA_Ji/study_week5_Ji_A.py" @@ -0,0 +1,40 @@ +# 풀이 1번(간단한 풀이가 생각나면 더 추가하겠습니다!) +import re +ref = 'for the last week' +ref2 = "3people unFollowed me" + +def solution(s): + p = re.compile('\w+') # 단어 검출 패턴턴 + sp = re.compile('\s+') # 공백 검출 패턴 + m = p.findall(s) # 문자열에서 단어 검출해서 리스트에 저장 + s = sp.findall(s) # 문자열에서 공백 검출해서 리스트에 저장 + + answer = '' # 답 저장할 빈 문자열 생성 + for i, word in enumerate(m): # 단어 리스트의 단어와 인덱스를 차례로 가져옴 + if word[0].isalpha() and word[0].islower(): # 가져온 단어의 첫글자가 알파벳인데 소문자면 + answer += word[0].upper() # 대문자로 변환하여 답 문자열에 더함 + else: # 숫자거나나 대문자면 그대로 답 문자열에 더함 + answer+= word[0] + + for char in word[1:]: # 단어의 두번째 글자부터 끝까지 하나하나 탐색 + if char.isalpha() and char.isupper(): # 글자 중 알파벳이고, 대문자인 것이 있으면 + answer+=char.lower() # 소문자로 변환하여 답 문자열에 더함 + else: + answer+=char # 숫자거나 소문자면 그대로 더함 + if i < len(s): # 원래 주어진 문자열 s와 같아 지도록 + answer += s[i] # 검출한 공백을 답 문자열에 더함 + # for the last week 가 들어왔으면 + # 1. m = [for,the,last,week] 와 s = [ , , ] 두 리스트가 있고 + # 2. m 에서 for 문 돌려 첫번째로 for을 가져오면 + # 2-1. f -> 소문자이므로 F로 변환하여 answer += 'f' 현재answer: 'f' + # 2-2. o,r 은 둘다 소문자 이므로 그대로 더함 현재 answer: 'for' + # 2-3. s[0]에 들어있는 공백을 가져옴 -> 원래 문자열과 동일한 구성이 되도록함 현재 answer: 'for ' + # 이를 반복해서 answer에 계속 저장함 (answer에 문자가 계속 쌓임) + + return answer + +# title() : 맨앞이 숫자면 그다음 맨앞이 대문자 나머지 소문자자) +# capitalize() + +# split() +# ' '.join \ No newline at end of file diff --git "a/03122_Ji/5\354\243\274\354\260\250/QnA_Ji/study_week5_Ji_Q.py" "b/03122_Ji/5\354\243\274\354\260\250/QnA_Ji/study_week5_Ji_Q.py" new file mode 100644 index 0000000..d07a8c7 --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/QnA_Ji/study_week5_Ji_Q.py" @@ -0,0 +1,17 @@ +'''https://school.programmers.co.kr/learn/courses/30/lessons/12951 + +문제 설명 +JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고) +문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요. + +제한 조건 +s는 길이 1 이상 200 이하인 문자열입니다. +s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다. +숫자는 단어의 첫 문자로만 나옵니다. +숫자로만 이루어진 단어는 없습니다. +공백문자가 연속해서 나올 수 있습니다. +입출력 예 +s return +"3people unFollowed me" "3people Unfollowed Me" +"for the last week" "For The Last Week" +''' \ No newline at end of file diff --git "a/03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/color_block.py" "b/03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/color_block.py" new file mode 100644 index 0000000..ab3195a --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/color_block.py" @@ -0,0 +1,23 @@ +# https://school.programmers.co.kr/learn/courses/30/lessons/250125 + +def solution(board, h, w): + direction = [(-1,0),(1,0),(0,1),(0,-1)] + count = 0 + n = len(board) + + + for i,j in direction: + + neighbor_x = h + i + neighbor_y = w + j + + if neighbor_x < 0 or neighbor_y < 0 or neighbor_x >= n or neighbor_y >= n: + continue + elif board[neighbor_x][neighbor_y] == board[h][w]: + count +=1 + + return count + +board =[["blue", "red", "orange", "red"], ["red", "red", "blue", "orange"], ["blue", "orange", "red", "red"], ["orange", "orange", "red", "blue"]] +print(solution(board,1,1)) + diff --git "a/03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/detect.py" "b/03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/detect.py" new file mode 100644 index 0000000..45079f6 --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/detect.py" @@ -0,0 +1,60 @@ +import numpy as np +from collections import deque + +map_design = np.array([ + [ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 3, 0, 4, 0, 5, 0, 6, 0, 0], + [ 0, 0, 0, 0, 7, 0, 0, 8, 0, 0], + [ 0, 9, 0, 10, 0, 11, 0, 12, 0, 0], + [ 0, 0, 0, 0, 13, 0, 0, 0, 14, 0], + [ 0, 15, 0, 16, 0, 17, 0, 18, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +]) + + +def start_position(map, start, end): + max_x = map.shape[0] + max_y = map.shape[1] + + for i in range(max_x): + for j in range(max_y): + if map[i][j] == start: + st_x, st_y = i, j + if map[i][j] == end: + ed_x, ed_y = i+1, j+1 + return bfs(map, st_x, st_y, ed_x, ed_y) + + +def bfs(map_design, st_x, st_y, ed_x, en_y): + q = deque() + visited = np.array([[1] * en_y for _ in range(ed_x)]) + q.append((st_x,st_y)) + + while True: + if len(q) == 0: + break + + direction = [(1,0), (-1,0), (0,1), (0,-1)] + + current_x, current_y = q.popleft() + + for x,y in direction: + next_x = current_x + x + next_y = current_y + y + + if next_x < 0 or next_y < 0 or next_x >= ed_x or next_y >= en_y: + continue + if visited[next_x][next_y] == 1: + q.append([next_x, next_y]) + visited[next_x][next_y] = visited[current_x][current_y] + 1 + + if map_design[current_x][current_y] >= 3: + break + + if visited[ed_x - 1][en_y - 1] == 1: + return -1 + + else: + return visited[ed_x - 1][en_y - 1] + +print(start_position(map_design,2,10)) diff --git "a/03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/game_map.py" "b/03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/game_map.py" new file mode 100644 index 0000000..d8a5eff --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/game_map.py" @@ -0,0 +1,117 @@ +# https://school.programmers.co.kr/learn/courses/30/lessons/1844 + + +# 처음에 푼 버전전 +import numpy as np +from collections import deque + +def ROR_game(map): + visited = np.array(map) + # 시작 위치 + st_x,st_y = 0,0 + # 상대 진영 위치 + n = visited.shape[0] + m = visited.shape[1] + + q = deque() + q.append((st_x,st_y)) + + while True: + if len(q) == 0: + break + + # 로봇이 움직일 수 있는 방향 + direction = [(1, 0), (-1, 0), (0, 1), (0, -1)] + + # 현재 위치 -> 이미 이동했으므로 pop + current_x, current_y = q.popleft() + + # 상하좌우 이동할 수 있는 좌표로 가봄 + for x,y in direction: + if current_x == n-1 and current_y == m-1: + break + + next_x = current_x + x + next_y = current_y + y + + # 맵을 벗어나거나, 벽이면 갈 수 없음 + if next_x < 0 or next_y < 0 or next_x >= n or next_y >= m or\ + visited[next_x][next_y] == 0: + continue + if visited[next_x][next_y] == 1: + q.append((next_x,next_y)) + visited[next_x][next_y] = visited[current_x][current_y] + 1 + + if visited[n-1][m-1] == 1: + return -1 + else: + return visited[n-1][m-1] + + + +map1 = [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] +map2 = [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] + +# print(ROR_game(map1)) + + +# 프로그래머스에 numpy 가 안되길래 뺀 버전 입니다. +import copy +from collections import deque + +def ROR_game(map): + visited = copy.deepcopy(map) + + # 시작 위치 + st_x,st_y = 0,0 + # 상대 진영 위치 + n = len(visited) + m = len(visited[0]) + + q = deque() + q.append((st_x,st_y)) + + while True: + if len(q) == 0: + break + + # 로봇이 움직일 수 있는 방향 + direction = [(1, 0), (-1, 0), (0, 1), (0, -1)] + + # 현재 위치 -> 이미 이동했으므로 pop + current_x, current_y = q.popleft() + + # 상하좌우 이동할 수 있는 좌표로 가봄 + for x,y in direction: + if current_x == n-1 and current_y == m-1: + break + + next_x = current_x + x + next_y = current_y + y + + # 맵을 벗어나거나, 벽이면 갈 수 없음 + if next_x < 0 or next_y < 0 or next_x >= n or next_y >= m or\ + visited[next_x][next_y] == 0: + continue + if visited[next_x][next_y] == 1: + q.append((next_x,next_y)) + visited[next_x][next_y] = visited[current_x][current_y] + 1 + + if visited[n-1][m-1] == 1: + return -1 + else: + return visited[n-1][m-1] + +map1 = [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] +map2 = [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] + +print(ROR_game(map1)) + + + + + + + + + diff --git "a/03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/minsu.py" "b/03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/minsu.py" new file mode 100644 index 0000000..7b36861 --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/minsu.py" @@ -0,0 +1,99 @@ +# 필요한 라이브러리 import +import numpy as np +from collections import deque + +# 주어진 map 디자인 +map_design = np.array([ + [ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 3, 0, 4, 0, 5, 0, 6, 0, 0], + [ 0, 0, 0, 0, 7, 0, 0, 8, 0, 0], + [ 0, 9, 0, 10, 0, 11, 0, 12, 0, 0], + [ 0, 0, 0, 0, 13, 0, 0, 0, 14, 0], + [ 0, 15, 0, 16, 0, 17, 0, 18, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +]) + + +def start_position(map, start, end): + # 맵의 x축 길이와 y축 길이 계산 + # 이유 : 로봇이 맵밖으로 탈출하면 안되기때문에 계산 + # 시작 위치와 도착지를 좌표형식으로 표현할수도 있음 + # 만약 numpy array가 아닌 일반 list라면 어떻게 해야할까? + # 정답 : max_x = len(map), max_y = len(map[0])으로 활용할수 있다. + max_x = map.shape[0] + max_y = map.shape[1] + + # 시작 위치와 도착지의 index를 계산 + # 이유 : index를 활용하여 시작위치와 도착위치를 좌표 형식으로 나타내기 위함 + # 예를 들어 우리 지구에서 청와대의 좌표를 특정하려면 북위 37° 32′ 01″, 동경 126° 58′ 40″와 같이 위도와 경도로 표현할수 있습니다. + # 이처럼 프로그램에서 리스트나 numpy와 같이 나타내진 형태로 시작 위치를 알기 위해서는 index를 활용할수 있음 + for i in range(max_x): + for j in range(max_y): + # 이중 for문을 사용해서 x축과 y축으로 좌표를 특정 + # 첫번째 for문 : 행을 순차적으로 입력 + # 두번째 for문 : 입력된 행안에서 열방향으로 순차적으로 입력 + # 이후 아래 if문을 활용해서 시작 지점과 도착지점의 값과 동일한 인덱스를 좌표로 지정 + if map[i][j] == start: + st_x, st_y = i, j + if map[i][j] == end: + ed_x, ed_y = i+1, j+1 + return bfs(map, st_x, st_y, ed_x, ed_y) + +# 최단 경로를 구하기 위해서는 BFS를 사용. 이는 수업시간에도 언급 +def bfs(map_design, st_x, st_y, ed_x, en_y): + # 로봇의 이동 가능 지역을 append하기 위해 deque클래스를 초기화 + q = deque() + # 로봇이 방문했다면 방문했다는 체크를 할수 있는 체크 배열을 생성 + # 단, 저는 본 문제에서 출발지가 2로 고정되어있고, 도착지가 3이상인 숫자임을 보았을때, + # 전체 지도를 체크 배열로 만드는것이 아닌 출발지와 도착지까지의 배열만 사용하면 된다고 판단(capture1.png파일 참고) + # 또한, 최단 경로를 계산하기 위해서 1인 배열로 초기화 로봇이 도착할때 마다, +1을 할 예정 + visited = np.array([[1] * en_y for _ in range(ed_x)]) + # 처음 시작지역을 이동가능 deque에 삽입 + q.append((st_x, st_y)) + + + while True: + # 만약, stack에 아무것도 없다면, 도착지에 도착을 하였거나, 이동 가능한 지역이 없는 것이기에 반복문 종료 + if len(q) == 0: + break + + # 로봇은 한칸씩 움직일수 밖에 없기 때문에, 로봇의 상대 좌표로 위, 아래, 오른쪽, 왼쪽으로 이동할 수 있게 방향을 지정 + # 예를 들어 로봇의 위치가 (2,3)일때 위로 이동하면? (2,4) + direction = [(1,0), (-1,0), (0, 1), (0, -1)] + + # 현재의 좌표는 이동이 완료 되었기 때문에, 이동가능한 stack에서 pop + current_x, current_y = q.popleft() + # 현재 좌표에서 상,하,좌,우로 다 이동하기 위해 for문 사용 + # 로봇은 이동가능지역인지? 아닌지 모르기때문에, 상하좌우로 다 이동해 봐야함 + for x, y in direction: + # 이제 이동해봅시다. 현재 좌표에서 x, y를 각각 더해주면 이동완료 + # 예를들어 현재 좌표가 (2,3)이라면, 다음 이동할 좌표는 상: (2,4), 하 : (2,2), 우: (3,3), 좌: {1,3} + next_x = current_x + x + next_y = current_y + y + + # 이동한 로봇이 벽이거나, 맵 밖이라면? 그 이동된 좌표는 무시해야하되기때문에 continue + # break는 반복문을 완전히 빠져나가기 때문에 올바르지 않음 + # 이유 : for문 이기 때문에 위로 이동했을때, 맵밖이나 벽이라면 나머지 하,좌,우는 어떤 상태인지 알수가 없음 + if next_x < 0 or next_y < 0 or next_x >= ed_x or next_y >= en_y: + continue + # 그럼 이제 이동된 좌표에서 체크배열을 확인했을때, 만약 1이라면 여기는 이동 가능한 좌표구나를 판단 가능 + if visited[next_x][next_y] == 1: + # 이동 가능한 좌표인 stack에 append + q.append([next_x, next_y]) + # 또한 +1 까지 왜? 최단 경로를 확인할수 있기 때문에(capture2.pdf참고) + visited[next_x][next_y] = visited[current_x][current_y] + 1 + + # 만약에 현재 위치의 값이 3보다 크면 도착지에 도착한것이기 때문에, 반복문 종료 + if map_design[current_x][current_y] >= 3: + break + # 위 내용을 반복 + + # 반복문이 종료되었을때, 도착지에서 체크배열이 1이라면? 아무곳도 이동을 못했다라고 판단 가능 + # 왜? 이동이 가능하면 +1씩 해주는데, +1이 안되었다면, 이동가능한곳이 아무데도 없다라는 뜻이기 때문에 + if visited[ed_x - 1][en_y - 1] == 1: + return -1 + # 아니라면 체크배열의 값을 return하면서 종료 + else : + return visited[ed_x - 1][en_y -1] + +print(start_position(map_design, 2, 10)) \ No newline at end of file diff --git "a/03122_Ji/5\354\243\274\354\260\250/python_A_Ji.py" "b/03122_Ji/5\354\243\274\354\260\250/python_A_Ji.py" new file mode 100644 index 0000000..5926ecf --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/python_A_Ji.py" @@ -0,0 +1,87 @@ +# 저는 다른 부분은 잘 모르겠어서 맵이 주어졌을 때 turtle을 이용해 맵을 그리고 +# 시작 위치와 장애물을 표시하는 모듈만드는 부분을 구현해봤습니다! + +import turtle +import pandas as pd +import numpy as np + +# start position = (-300,200) + +class Draw_map: + mag = 50 + + def __init__(self,map): + self.map= map + turtle.setup(800,500) + self.t = turtle.Turtle() + self.t.speed(0) + + def draw_map(self): + self.map_size = list(self.map.shape) + self.edge_x = self.map_size[0]-1 + self.edge_y = self.map_size[1]-1 + + self.t.penup() + self.t.goto(-300,200) + self.t.pendown() + + self.t.goto(-300 + self.edge_y * Draw_map.mag, 200) + self.t.goto(-300 + self.edge_y * Draw_map.mag, 200 - self.edge_x * Draw_map.mag) + self.t.goto(-300 , 200 - self.edge_x * Draw_map.mag) + self.t.goto(-300,200) + + for i in range(1,self.map_size[1]): + self.t.penup() + self.t.goto(-300 + i * Draw_map.mag, 200) + self.t.pendown() + self.t.setheading(-90) + self.t.forward(self.edge_x*Draw_map.mag) + + + for i in range(1,self.map_size[0]): + self.t.penup() + self.t.goto(-300, 200 - i * Draw_map.mag) + self.t.pendown() + self.t.setheading(0) + self.t.forward(self.edge_y*Draw_map.mag) + + self.t.hideturtle() + + + def draw_obstacle(self): + self.rows,self.cols = np.where(self.map>2) + self.obstacle = list(zip(self.rows,self.cols)) + + self.t.penup() + self.t.goto(-300,200) + self.t.dot(10,'green') + + for coordi in self.obstacle: + self.t.penup() + self.t.goto(-300 + coordi[1]* Draw_map.mag, 200 - coordi[0] * Draw_map.mag) + self.t.pendown() + self.t.dot(10,'red') + + self.t.hideturtle() + + def exit(self): + turtle.exitonclick() + + +if __name__ == '__main__': + map = np.array([ + [ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 3, 0, 4, 0, 5, 0, 6, 0, 0], + [ 0, 0, 0, 0, 7, 0, 0, 8, 0, 0], + [ 0, 9, 0, 10, 0, 11, 0, 12, 0, 0], + [ 0, 0, 0, 0, 13, 0, 0, 0, 14, 0], + [ 0, 15, 0, 16, 0, 17, 0, 18, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ]) + + + map_drawer = Draw_map(map) + + map_drawer.draw_map() + map_drawer.draw_obstacle() + map_drawer.exit() diff --git "a/03122_Ji/5\354\243\274\354\260\250/python_Q.md" "b/03122_Ji/5\354\243\274\354\260\250/python_Q.md" new file mode 100644 index 0000000..b3a72fa --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/python_Q.md" @@ -0,0 +1,41 @@ +# 문제 1: 터틀 그래픽스를 활용한 물류창고 최단 경로 탐색 +- 사용 라이브러리: Turtle Graphics, BFS/DFS, pandas, numpy + +## 문제 설명 +> - 맵구조 라는 맵이 주어진다. +> - 시작 위치(2)는 왼쪽 상단 모서리 (0,0)이며, 특정 제품(3~18)까지 이동 후 다시 원래 위치로 돌아와야 한다. +> - 제품(3~18)은 장애물로 간주되며, 터틀은 이를 피해서 이동해야 한다.(0은 이동 가능) +> - BFS 또는 DFS를 사용하여 최단 경로를 탐색한다. +> - Turtle Graphics를 이용해 창고 맵을 그리고, 터틀이 이동하는 경로를 시각화한다. +>>맵 구조(아래에 좀더 이쁘게 [[ ],[ ],[ ]]한거 확인 하고 쓰셔요. 요구사항 아래에 있음) + ```가로: 10 세로: 7 + 2 0 0 0 0 0 0 0 0 0 + 0 3 0 4 0 5 0 6 0 0 + 0 0 0 0 7 0 0 8 0 0 + 0 9 0 10 0 11 0 12 0 0 + 0 0 0 0 13 0 0 0 14 0 + 0 15 0 16 0 17 0 18 0 0 + 0 0 0 0 0 0 0 0 0 0 + ``` +>- 2: 시작 위치 (0,0) +>- 3~18: 제품 (이동 불가) +>- 0: 이동 가능 +## 요구 사항 +- 주어진 맵을 numpy 배열로 저장하고 pandas 데이터프레임으로 변환한다. +- BFS 또는 DFS를 이용하여 특정 제품(예: 10)에 도달하는 최단 경로를 찾는다. +- 제품 위치를 피해서 이동해야 한다. +- 제품에 도달한 후 다시 원래 위치(0,0)로 돌아오는 최단 경로를 찾는다. +- Turtle Graphics를 활용하여 이동 경로를 시각화한다. + +## 맵구조 아래 꺼 활용하실분들은 활용 하세용 +``` +([ + [ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 3, 0, 4, 0, 5, 0, 6, 0, 0], + [ 0, 0, 0, 0, 7, 0, 0, 8, 0, 0], + [ 0, 9, 0, 10, 0, 11, 0, 12, 0, 0], + [ 0, 0, 0, 0, 13, 0, 0, 0, 14, 0], + [ 0, 15, 0, 16, 0, 17, 0, 18, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +]) +``` \ No newline at end of file diff --git "a/03122_Ji/5\354\243\274\354\260\250/study_kim_5week_A_Ji.py" "b/03122_Ji/5\354\243\274\354\260\250/study_kim_5week_A_Ji.py" new file mode 100644 index 0000000..0ae8046 --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/study_kim_5week_A_Ji.py" @@ -0,0 +1,12 @@ +# https://school.programmers.co.kr/learn/courses/30/lessons/42748 + +def solution(array, commands): + answer = [] + + for command in commands: + i,j,k = command[0],command[1],command[2] + new_array = array[i-1:j] + new_array.sort() + answer.append(new_array[k-1]) + + return answer \ No newline at end of file diff --git "a/03122_Ji/5\354\243\274\354\260\250/study_week5_A_jwlee.py" "b/03122_Ji/5\354\243\274\354\260\250/study_week5_A_jwlee.py" new file mode 100644 index 0000000..1ce8a85 --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/study_week5_A_jwlee.py" @@ -0,0 +1,88 @@ +# ; 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. +# ; 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. + +# ; 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... +# ; 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... +# ; 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ... + +# ; 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, +# ; 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요. + +# ; 제한 조건 +# ; 시험은 최대 10,000 문제로 구성되어있습니다. +# ; 문제의 정답은 1, 2, 3, 4, 5중 하나입니다. +# ; 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요. + +# ; 입출력 예 +# ; answers return +# ; 예 #1 [1,2,3,4,5] [1] +# ; 예 #2 [1,3,2,4,2] [1,2,3] + +# ; 입출력 예 설명 +# ; 입출력 예 #1 + +# ; 수포자 1은 모든 문제를 맞혔습니다. +# ; 수포자 2는 모든 문제를 틀렸습니다. +# ; 수포자 3은 모든 문제를 틀렸습니다. +# ; 따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다. + +# ; 입출력 예 #2 + +# ; 모든 사람이 2문제씩을 맞췄습니다. + +# ; 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... +# ; 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... +# ; 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ... + + +def solution(answers): + N = len(answers) + + pattern1 = [1,2,3,4,5] + pattern2 = [2,1,2,3,2,4,2,5] + pattern3 = [3,3,1,1,2,2,4,4,5,5] + + answer1 = [] + answer2 = [] + answer3 = [] + + # 1 + i=0 + for _ in range(N): + i = i % len(pattern1) + answer1.append(pattern1[i]) + i += 1 + + # 2 + i=0 + for _ in range(N): + i = i % len(pattern2) + answer2.append(pattern2[i]) + i += 1 + + # 3 + i=0 + for _ in range(N): + i = i % len(pattern3) + answer2.append(pattern3[i]) + i += 1 + + c1 = [a == a1 for a , a1 in zip(answers,answer1)].count(True) + c2 = [a == a2 for a , a2 in zip(answers,answer2)].count(True) + c3 = [a == a3 for a , a3 in zip(answers,answer3)].count(True) + + c = [c1,c2,c3] + result = [] + max_c = max(c) + + for idx, cs in enumerate(c): + if cs == max_c: + result.append(idx+1) + + return result + + +print(solution([1,2,3,4,5])) + + +# pop 을 하면 시간 복잡도가 높아진다. \ No newline at end of file diff --git "a/03122_Ji/5\354\243\274\354\260\250/study_week_5_A_seok.py" "b/03122_Ji/5\354\243\274\354\260\250/study_week_5_A_seok.py" new file mode 100644 index 0000000..2b4446d --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/study_week_5_A_seok.py" @@ -0,0 +1,96 @@ +# https://www.acmicpc.net/problem/11559 + +'''------------------------------------------------------------------------------------------------------------------------------------------------------------------ + +문제 + +뿌요뿌요의 룰은 다음과 같다. + + 필드에 여러 가지 색깔의 뿌요를 놓는다. 뿌요는 중력의 영향을 받아 아래에 바닥이나 다른 뿌요가 나올 때까지 아래로 떨어진다. + + 뿌요를 놓고 난 후, 같은 색 뿌요가 4개 이상 상하좌우로 연결되어 있으면 연결된 같은 색 뿌요들이 한꺼번에 없어진다. 이때 1연쇄가 시작된다. + + 뿌요들이 없어지고 나서 위에 다른 뿌요들이 있다면, 역시 중력의 영향을 받아 차례대로 아래로 떨어지게 된다. + + 아래로 떨어지고 나서 다시 같은 색의 뿌요들이 4개 이상 모이게 되면 또 터지게 되는데, 터진 후 뿌요들이 내려오고 다시 터짐을 반복할 때마다 1연쇄씩 늘어난다. + + 터질 수 있는 뿌요가 여러 그룹이 있다면 동시에 터져야 하고 여러 그룹이 터지더라도 한번의 연쇄가 추가된다. + + +남규는 최근 뿌요뿌요 게임에 푹 빠졌다. 이 게임은 1:1로 붙는 대전게임이라 잘 쌓는 것도 중요하지만, 상대방이 터뜨린다면 연쇄가 몇 번이 될지 바로 파악할 수 있는 능력도 필요하다. + +하지만 아직 실력이 부족하여 남규는 자기 필드에만 신경 쓰기 바쁘다. 상대방의 필드가 주어졌을 때, 연쇄가 몇 번 연속으로 일어날지 계산하여 남규를 도와주자! + +--------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +입력 + +총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. + +이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. + +R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다. + +입력으로 주어지는 필드는 뿌요들이 전부 아래로 떨어진 뒤의 상태이다. 즉, 뿌요 아래에 빈 칸이 있는 경우는 없다. + +--------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +출력 + +현재 주어진 상황에서 몇연쇄가 되는지 출력한다. 하나도 터지지 않는다면 0을 출력한다. + +--------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +예제 입력 예제 출력 + + 3 +...... +...... +...... +...... +...... +...... +...... +...... +.Y.... +.YG... +RRYG.. +RRYGG. + +------------------------------------------------------------------------------------------------------------------------------------------------------------------''' + +import numpy as np + +field = np.array([ + ['.','.','.','.','.','.'], + ['.','.','.','.','.','.'], + ['.','.','.','.','.','.'], + ['.','.','.','.','.','.'], + ['.','.','.','.','.','.'], + ['.','.','Y','.','.','.'], + ['.','.','Y','.','.','.'], + ['.','.','.','.','.','.'], + ['.','.','.','.','G','.'], + ['.','.','.','.','.','.'], + ['.','R','.','.','.','.'], + ['.','.','.','.','.','.'], +]) + +def puyopuyo(field): + pass + + +# 뿌요가 터진 뒤 아래로 정렬시키는 함수 +def update_field(field): + moved = True + while moved: + moved = False + for i in range(10,-1,-1): + for j in range(6): + if field[i,j] != '.' and field[i, j].isalpha() and field[i+1,j]=='.': + field[i,j],field[i+1,j] = field[i+1,j],field[i,j] + moved = True + + return field + +print(update_field(field)) \ No newline at end of file diff --git "a/03122_Ji/6\354\243\274\354\260\250/QnA_Ji/study_week6_Ji_A.py" "b/03122_Ji/6\354\243\274\354\260\250/QnA_Ji/study_week6_Ji_A.py" new file mode 100644 index 0000000..c6eb988 --- /dev/null +++ "b/03122_Ji/6\354\243\274\354\260\250/QnA_Ji/study_week6_Ji_A.py" @@ -0,0 +1,29 @@ +# https://school.programmers.co.kr/learn/courses/30/lessons/92334 +def solution(id_list,report,k): + report_dict = {key:set() for key in id_list} # id_list에 있는 유저 네임으로 set()을 가지는 딕셔너리 생성(유저-신고한id 저장하기 위함) + + for user in report: + report_dict[user.split(' ')[0]].add(user.split(' ')[1]) # 유저: (신고한 아이디) 형태로 딕셔너리에 저장한다(set 형식이므로 한 유저가 같은 유저를 몇번 신고해도 한번 들어감) + + reported_dict = dict.fromkeys(id_list, 0) # 유저 별 신고당한 횟수를 저장하는 딕셔너리 생성(기본값 0) + for reported_user in report_dict.values(): # 유저-신고한 id 딕셔너리의 value 값에서 등장한 만큼 각 유저의 신고당한 횟수 +1 + for name in reported_user: + reported_dict[name] += 1 + + email_dict = dict.fromkeys(id_list,0) # 이메일 받는 횟수를 저장할 딕셔너리 생성 + for id, reported_count in reported_dict.items(): # 유저 별로 신고당한 횟수가 k 이상일 경우우 + if reported_count >= k: + email_reci= [key for key in email_dict.keys() if id in report_dict[key]] # 이메일 수신자를 결정한다 + for key in email_reci: # ((신고 k회 이상 당한 id가 아니면서)이건 자진신고 못하니까 빼고고 , 이 id를 신고한 적 잇는 유저 대상) + email_dict[key]+=1 # 횟수 +1 + + + return list(email_dict.values()) + + + +id = ["muzi", "frodo", "apeach", "neo"] +report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] + +print(solution(id,report,2)) + \ No newline at end of file diff --git "a/03122_Ji/6\354\243\274\354\260\250/QnA_Ji/study_week6_Ji_Q.py" "b/03122_Ji/6\354\243\274\354\260\250/QnA_Ji/study_week6_Ji_Q.py" new file mode 100644 index 0000000..27929a0 --- /dev/null +++ "b/03122_Ji/6\354\243\274\354\260\250/QnA_Ji/study_week6_Ji_Q.py" @@ -0,0 +1,70 @@ +# https://school.programmers.co.kr/learn/courses/30/lessons/92334 +''' +문제 설명 +신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. + +각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다. +신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다. +한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다. +k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다. +유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다. +다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다. + +유저 ID 유저가 신고한 ID 설명 +"muzi" "frodo" "muzi"가 "frodo"를 신고했습니다. +"apeach" "frodo" "apeach"가 "frodo"를 신고했습니다. +"frodo" "neo" "frodo"가 "neo"를 신고했습니다. +"muzi" "neo" "muzi"가 "neo"를 신고했습니다. +"apeach" "muzi" "apeach"가 "muzi"를 신고했습니다. + +각 유저별로 신고당한 횟수는 다음과 같습니다. + +유저 ID 신고당한 횟수 +"muzi" 1 +"frodo" 2 +"apeach" 0 +"neo" 2 +위 예시에서는 2번 이상 신고당한 "frodo"와 "neo"의 게시판 이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다. + +유저 ID 유저가 신고한 ID 정지된 ID +"muzi" ["frodo", "neo"] ["frodo", "neo"] +"frodo" ["neo"] ["neo"] +"apeach" ["muzi", "frodo"] ["frodo"] +"neo" 없음 없음 +따라서 "muzi"는 처리 결과 메일을 2회, "frodo"와 "apeach"는 각각 처리 결과 메일을 1회 받게 됩니다. + +이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, +각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요. + +제한사항 +2 ≤ id_list의 길이 ≤ 1,000 +1 ≤ id_list의 원소 길이 ≤ 10 +id_list의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있습니다. +id_list에는 같은 아이디가 중복해서 들어있지 않습니다. +1 ≤ report의 길이 ≤ 200,000 +3 ≤ report의 원소 길이 ≤ 21 + +report의 원소는 "이용자id 신고한id"형태의 문자열입니다. +예를 들어 "muzi frodo"의 경우 "muzi"가 "frodo"를 신고했다는 의미입니다. +id는 알파벳 소문자로만 이루어져 있습니다. +이용자id와 신고한id는 공백(스페이스)하나로 구분되어 있습니다. +자기 자신을 신고하는 경우는 없습니다. + +1 ≤ k ≤ 200, k는 자연수입니다. +return 하는 배열은 id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다. + +입출력 예 +id_list report k result +["muzi", "frodo", "apeach", "neo"] ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] 2 [2,1,1,0] +["con", "ryan"] ["ryan con", "ryan con", "ryan con", "ryan con"] 3 [0,0] + +입출력 예 설명 +입출력 예 #1 + +문제의 예시와 같습니다. + +입출력 예 #2 + +"ryan"이 "con"을 4번 신고했으나, 주어진 조건에 따라 한 유저가 같은 유저를 여러 번 신고한 경우는 신고 횟수 1회로 처리합니다. 따라서 "con"은 1회 신고당했습니다. +3번 이상 신고당한 이용자는 없으며, "con"과 "ryan"은 결과 메일을 받지 않습니다. 따라서 [0, 0]을 return 합니다. +''' \ No newline at end of file diff --git "a/03122_Ji/\354\212\244\355\204\260\353\224\224 1\354\243\274\354\260\250_\354\247\200\354\230\210\354\235\200.docx" "b/03122_Ji/\354\212\244\355\204\260\353\224\224 1\354\243\274\354\260\250_\354\247\200\354\230\210\354\235\200.docx" new file mode 100644 index 0000000..4ce2a7a Binary files /dev/null and "b/03122_Ji/\354\212\244\355\204\260\353\224\224 1\354\243\274\354\260\250_\354\247\200\354\230\210\354\235\200.docx" differ diff --git a/README.md b/README.md deleted file mode 100644 index 789112f..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# ROMiserables -- 로기 스터디 diff --git a/virtual/src/webcam_add_save.py b/virtual/src/webcam_add_save.py new file mode 100644 index 0000000..bf54f61 --- /dev/null +++ b/virtual/src/webcam_add_save.py @@ -0,0 +1,45 @@ +import cv2 + +cap = cv2.VideoCapture(0) + +if not (cap.isOpened()): + print("Could not open video device") + +cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) +cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) + +# 저장하려는 영상의 코덱 설정 +# 영상 코덱이란? + # 영상신호를 디지털 신호로 변환하여 컴퓨터가 읽을 수 있게 하고, + # 다시 모니터에 원래의 영상신호로 변환하여 사용자가 알 수 있게 재생 시켜주는 소프트웨어 +# 이러한, 코덱은 저장하려는 영상의 확장자에 따라 인자가 달라진다. +# mp4v = .mp4 or .mov / DIVX or XVID = .avi 등 +fourcc = cv2.VideoWriter_fourcc(*'XVID') + +# 영상 클래스를 객체화 +# 인자 + # 1. 영상을 저장하기 위한 경로 + # 2. 영상 코덱 + # 3. fps + # 4. 해상도 높이(int), 너비(int) +out = cv2.VideoWriter('./output.avi', fourcc, 30.0, (640, 480)) + +while True: + ret, frame = cap.read() + + if not ret: + break + + # frame을 인자로 하여 영상 저장 + out.write(frame) + + cv2.imshow('frame', frame) + + if cv2.waitKey(10) == ord('q'): + print('quit') + break + +cap.release() +# 메모리 정리 : 영상 저장 끝내기 +out.release() +cv2.destroyAllWindows() \ No newline at end of file diff --git a/virtual/src/webcam_start.py b/virtual/src/webcam_start.py new file mode 100644 index 0000000..062df1a --- /dev/null +++ b/virtual/src/webcam_start.py @@ -0,0 +1,39 @@ +# opencv 모듈 호출 +import cv2 + +# id가 0번인 카메라에서 비디오가 반환 +cap = cv2.VideoCapture(0) + +# 카메라가 연결이 되어 있는지 안되어 있는지 확인 +# 만약, 웹캠이 분명 연결되어있는데, 하단에 문구가 뜬다면 접촉불량일 수 있다. +if not (cap.isOpened()): + print("Could not open video device") + +# 카메라의 해상도를 지정 +# 너비(가로) 640, 높이(세로) 480 +cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) +cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) + + +while True: + # 연결된 카메라를 frame으로 읽음 + # ret는 frame이 생성되면 True 또는 아니면 False를 반환 + # _, frame = cap.read()라고 되어있는 것들도 있다. + ret, frame = cap.read() + + # ret == False면 break + if not ret: + break + + # 읽어낸 frame을 출력 + cv2.imshow('frame', frame) + + # while문을 벗어날 이벤트를 생성 + # 키보드의 q를 입력할시 quit를 터미널에 출력하고 반복문을 break + if cv2.waitKey(10) == ord('q'): + print('quit') + break + +# 최종 메모리 정리 +cap.release() +cv2.destroyAllWindows() \ No newline at end of file