From ffc79ab12c50db310b99cb8ad0307271b97a1a12 Mon Sep 17 00:00:00 2001 From: yeyeyeyeyeyeun Date: Sat, 25 Jan 2025 13:59:28 +0900 Subject: [PATCH 01/13] solve problems --- .../importantroad_ji.py" | 18 ++++ .../2\354\243\274\354\260\250/kingQ_Ji.py" | 94 ++++++++++++++++++ .../study_2week_kimQ_Ji.py" | 30 ++++++ .../study_week2_Q_jwlee_Ji.py" | 38 +++++++ .../study_week2_A_ji.py" | 26 +++++ .../study_week2_Q_ji.py" | 13 +++ ...\354\247\200\354\230\210\354\235\200.docx" | Bin 0 -> 162 bytes ...\354\247\200\354\230\210\354\235\200.docx" | Bin 0 -> 41677 bytes 8 files changed, 219 insertions(+) create mode 100644 "03122_Ji/2\354\243\274\354\260\250/importantroad_ji.py" create mode 100644 "03122_Ji/2\354\243\274\354\260\250/kingQ_Ji.py" create mode 100644 "03122_Ji/2\354\243\274\354\260\250/study_2week_kimQ_Ji.py" create mode 100644 "03122_Ji/2\354\243\274\354\260\250/study_week2_Q_jwlee_Ji.py" create mode 100644 "03122_Ji/2\354\243\274\354\260\250/\353\254\270\354\240\234/study_week2_A_ji.py" create mode 100644 "03122_Ji/2\354\243\274\354\260\250/\353\254\270\354\240\234/study_week2_Q_ji.py" create mode 100644 "03122_Ji/~$\353\224\224 1\354\243\274\354\260\250_\354\247\200\354\230\210\354\235\200.docx" create mode 100644 "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" 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..ed73fb4 --- /dev/null +++ "b/03122_Ji/2\354\243\274\354\260\250/kingQ_Ji.py" @@ -0,0 +1,94 @@ +# 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 + + 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() # 킹 움직임 번복 + return # 함수 나가서 다음 반복문으로 + + if 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(f'킹의 마지막 위치: {king.where()}') +print(f'돌의 마지막 위치: {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..34f2cbd --- /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,26 @@ +# 문제 설명 +# 문자열 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)) \ 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_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/~$\353\224\224 1\354\243\274\354\260\250_\354\247\200\354\230\210\354\235\200.docx" "b/03122_Ji/~$\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 0000000000000000000000000000000000000000..9ed2d716df7890b20a6713882d1537cfbfd72f39 GIT binary patch literal 162 zcmd;xOieA#Q}D`UAO&zRL^7lTVJSl%g93vW14#F8Mh1qM_HSttKsJm%y9m`(CMXvs g-u;DZO?~EV#(sv<*~_dM7+`z`#s;uTwFlm{09d^n4gdfE literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4ce2a7a934bea7f63eea50d0abc8372ed16fc112 GIT binary patch literal 41677 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 Date: Sat, 25 Jan 2025 14:02:31 +0900 Subject: [PATCH 02/13] =?UTF-8?q?Delete=2003122=5FJi/~$=EB=94=94=201?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=5F=EC=A7=80=EC=98=88=EC=9D=80.docx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...250_\354\247\200\354\230\210\354\235\200.docx" | Bin 162 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 "03122_Ji/~$\353\224\224 1\354\243\274\354\260\250_\354\247\200\354\230\210\354\235\200.docx" diff --git "a/03122_Ji/~$\353\224\224 1\354\243\274\354\260\250_\354\247\200\354\230\210\354\235\200.docx" "b/03122_Ji/~$\353\224\224 1\354\243\274\354\260\250_\354\247\200\354\230\210\354\235\200.docx" deleted file mode 100644 index 9ed2d716df7890b20a6713882d1537cfbfd72f39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmd;xOieA#Q}D`UAO&zRL^7lTVJSl%g93vW14#F8Mh1qM_HSttKsJm%y9m`(CMXvs g-u;DZO?~EV#(sv<*~_dM7+`z`#s;uTwFlm{09d^n4gdfE From 89d4906cb301c64643e3bbe6454ffd17ddb98a80 Mon Sep 17 00:00:00 2001 From: yeyeyeyeyeyeun Date: Sat, 25 Jan 2025 17:12:48 +0900 Subject: [PATCH 03/13] modi_king --- "03122_Ji/2\354\243\274\354\260\250/kingQ_Ji.py" | 9 ++++++--- .../\353\254\270\354\240\234/study_week2_A_ji.py" | 4 +++- 2 files changed, 9 insertions(+), 4 deletions(-) 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" index ed73fb4..f24f386 100644 --- "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" @@ -39,14 +39,17 @@ 'B':(0,-1), 'T':(0,1), 'RT':(1,1), - 'LT': (-1,1), - 'RB': (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]]) @@ -75,7 +78,7 @@ def move_back(self, moving_cmd): # 커맨드 반대로 되돌 def move_chessman(cmd): # 킹 이동 및 돌과 겹치면 돌 이동, 체스판을 넘어가면면 다시 원래 자리로 돌아가게 하는 함수 king_next = king.move(cmd) # 킹 이동동 if king_next == False: # 킹 이동이 체스판 범위를 넘음 - king.move_back() # 킹 움직임 번복 + king.move_back(cmd) # 킹 움직임 번복 return # 함수 나가서 다음 반복문으로 if king.now == dol.now: # 킹과 돌의 위치가 같다 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" index 34f2cbd..aaed121 100644 --- "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" @@ -23,4 +23,6 @@ def solution(s): return False s = 'a1234' -print(solution(s)) \ No newline at end of file +print(solution(s)) + +# if 문 층이 많을수록 안좋다 From aa70d694bf8a3f0648c9995cd2091b2c6aa3182a Mon Sep 17 00:00:00 2001 From: yeyeyeyeyeyeun Date: Tue, 28 Jan 2025 15:22:58 +0900 Subject: [PATCH 04/13] upload_week3_QnA --- .../2\354\243\274\354\260\250/kingQ_Ji.py" | 7 +- .../QnA_Ji/study_week3_Q_Ji.py" | 110 ++++++++++++++++++ 2 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 "03122_Ji/3\354\243\274\354\260\250/QnA_Ji/study_week3_Q_Ji.py" 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" index f24f386..40f361a 100644 --- "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" @@ -64,6 +64,7 @@ def move(self, moving_cmd): # 체스말 이동 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): @@ -78,10 +79,8 @@ def move_back(self, moving_cmd): # 커맨드 반대로 되돌 def move_chessman(cmd): # 킹 이동 및 돌과 겹치면 돌 이동, 체스판을 넘어가면면 다시 원래 자리로 돌아가게 하는 함수 king_next = king.move(cmd) # 킹 이동동 if king_next == False: # 킹 이동이 체스판 범위를 넘음 - king.move_back(cmd) # 킹 움직임 번복 - return # 함수 나가서 다음 반복문으로 - - if king.now == dol.now: # 킹과 돌의 위치가 같다 + king.move_back(cmd) # 킹 움직임 번복 + elif king.now == dol.now: # 킹과 돌의 위치가 같다 dol_next = dol.move(cmd) # 돌을 킹이 움직인 방향으로 움직임 if dol_next == False: # 돌이 체스판 벗어남 king.move_back(cmd) # 킹과 돌 원래 자리로 돌아감 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 From 808a8b57702b56e92de423171b8e117b15fff2b1 Mon Sep 17 00:00:00 2001 From: yeyeyeyeyeyeun Date: Sat, 1 Feb 2025 03:42:41 +0900 Subject: [PATCH 05/13] upload study_week3_A_Ji --- .../QnA_Ji/study_week3_A_Ji.py" | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 "03122_Ji/3\354\243\274\354\260\250/QnA_Ji/study_week3_A_Ji.py" 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)) From bbb6c9029e9b7308c0b823c01048abe14311cbba Mon Sep 17 00:00:00 2001 From: yeyeyeyeyeyeun Date: Mon, 3 Feb 2025 21:22:45 +0900 Subject: [PATCH 06/13] upload_week4_QnA_Ji --- .../3\354\243\274\354\260\250/pythonQ.md" | 132 ++++++++++++++++++ .../study_3week_kimQ.py" | 8 ++ .../study_week3_Q_jwlee.py" | 12 ++ .../study_week_3_Q_seok.py" | 60 ++++++++ .../QnA_Ji/study_week4_Ji_A.py" | 8 ++ .../QnA_Ji/study_week4_Ji_Q.py" | 21 +++ 6 files changed, 241 insertions(+) create mode 100644 "03122_Ji/3\354\243\274\354\260\250/pythonQ.md" create mode 100644 "03122_Ji/3\354\243\274\354\260\250/study_3week_kimQ.py" create mode 100644 "03122_Ji/3\354\243\274\354\260\250/study_week3_Q_jwlee.py" create mode 100644 "03122_Ji/3\354\243\274\354\260\250/study_week_3_Q_seok.py" create mode 100644 "03122_Ji/4\354\243\274\354\260\250/QnA_Ji/study_week4_Ji_A.py" create mode 100644 "03122_Ji/4\354\243\274\354\260\250/QnA_Ji/study_week4_Ji_Q.py" 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_kimQ.py" "b/03122_Ji/3\354\243\274\354\260\250/study_3week_kimQ.py" new file mode 100644 index 0000000..2ed9ea8 --- /dev/null +++ "b/03122_Ji/3\354\243\274\354\260\250/study_3week_kimQ.py" @@ -0,0 +1,8 @@ +# 음료 주문 프로그램 + +# menu={'coffee':3500,'latte':4000,'smoothie':5000,'tea':3000} + +# 해당 딕셔너리를 활용하여 음료 주문을 하는 GUI프로그램을 생성한다. +# 창 제목은 음료 주문 프로그램이라고 작성한다. +# exit버튼을 누르면 터미널에 음료 주문 프로그램을 종료했다는 문구와 함께 프로그램 창을 종료시킨다. +# 창에는 메뉴판에 있는 메뉴명을 기재하며 각 메뉴 버튼을 누르면 하단에 총 금액과 총 가격에 반영되도록 이벤트를 설정한다. 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..0b8c7ed --- /dev/null +++ "b/03122_Ji/3\354\243\274\354\260\250/study_week3_Q_jwlee.py" @@ -0,0 +1,12 @@ +# 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]] + 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..8fe2a16 --- /dev/null +++ "b/03122_Ji/4\354\243\274\354\260\250/QnA_Ji/study_week4_Ji_A.py" @@ -0,0 +1,8 @@ +def solution(order): + num_list = list(str(order)) + answer = 0 + for num in num_list: + if num in '369': + answer += 1 + print(answer) + return answer \ 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..7df94ed --- /dev/null +++ "b/03122_Ji/4\354\243\274\354\260\250/QnA_Ji/study_week4_Ji_Q.py" @@ -0,0 +1,21 @@ +# 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를 출력합니다. From fcfcc319c2dcf2bc6bc460fcfa4ebae94cdc14b2 Mon Sep 17 00:00:00 2001 From: yeyeyeyeyeyeun Date: Mon, 3 Feb 2025 22:06:36 +0900 Subject: [PATCH 07/13] upload_week4_QnA_Ji_modi --- .../QnA_Ji/study_week4_Ji_A.py" | 9 + .../QnA_Ji/study_week4_Ji_Q.py" | 53 ++-- .../4\354\243\274\354\260\250/python_A_Ji.py" | 17 ++ .../4\354\243\274\354\260\250/python_Q.md" | 249 ++++++++++++++++++ 4 files changed, 310 insertions(+), 18 deletions(-) create mode 100644 "03122_Ji/4\354\243\274\354\260\250/python_A_Ji.py" create mode 100644 "03122_Ji/4\354\243\274\354\260\250/python_Q.md" 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" index 8fe2a16..8b889dc 100644 --- "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" @@ -1,3 +1,4 @@ +# 1 def solution(order): num_list = list(str(order)) answer = 0 @@ -5,4 +6,12 @@ def solution(order): if num in '369': answer += 1 print(answer) + return answer + +# 2 +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 \ 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" index 7df94ed..818d863 100644 --- "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" @@ -1,21 +1,38 @@ -# https://school.programmers.co.kr/learn/courses/30/lessons/120891 -# 문제 설명 -# 머쓱이는 친구들과 369게임을 하고 있습니다. -# 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 -# 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. -# 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, -# 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요. +# 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 +제한사항 +1 ≤ order ≤ 1,000,000 +입출력 예 +order result +3 1 +29423 2 +입출력 예 설명 +입출력 예 #1 -# 3은 3이 1개 있으므로 1을 출력합니다. -# 입출력 예 #2 +3은 3이 1개 있으므로 1을 출력합니다. +입출력 예 #2 -# 29423은 3이 1개, 9가 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..ad8508a --- /dev/null +++ "b/03122_Ji/4\354\243\274\354\260\250/python_A_Ji.py" @@ -0,0 +1,17 @@ +# 1 +print(abs(-5)) + +# 2 전부 true +numbers = [True, True, False] +print(all(numbers)) + +# 3 +numbers = [0, 0, 1] +print(any(numbers)) + +# 4 +words = ["a", "b", "c"] +print(list(enumerate(words))) + + + 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 From 9b2981d4441897b1a860acf14ce7d2644eb9c507 Mon Sep 17 00:00:00 2001 From: yeyeyeyeyeyeun Date: Sun, 9 Feb 2025 23:34:27 +0900 Subject: [PATCH 08/13] upload week5 Q Ji --- .../2\354\243\274\354\260\250/kingQ_Ji.py" | 3 +- .../3\354\243\274\354\260\250/pythonA_Ji.py" | 92 +++++++++ .../study_3week_kimA_Ji.py" | 51 +++++ .../study_3week_kimQ.py" | 8 - .../study_week3_Q_jwlee.py" | 11 + .../QnA_Ji/study_week4_Ji_A.py" | 8 +- .../4\354\243\274\354\260\250/python_A_Ji.py" | 191 +++++++++++++++++- .../4\354\243\274\354\260\250/sketch.py" | 101 +++++++++ .../study_kim_4week_A_Ji.py" | 45 +++++ .../study_week4_A_jwlee_Ji.py" | 32 +++ .../study_week_4_Q_seok.py" | 165 +++++++++++++++ .../QnA_Ji/study_week5_Ji_Q.py" | 17 ++ 12 files changed, 707 insertions(+), 17 deletions(-) create mode 100644 "03122_Ji/3\354\243\274\354\260\250/pythonA_Ji.py" create mode 100644 "03122_Ji/3\354\243\274\354\260\250/study_3week_kimA_Ji.py" delete mode 100644 "03122_Ji/3\354\243\274\354\260\250/study_3week_kimQ.py" create mode 100644 "03122_Ji/4\354\243\274\354\260\250/sketch.py" create mode 100644 "03122_Ji/4\354\243\274\354\260\250/study_kim_4week_A_Ji.py" create mode 100644 "03122_Ji/4\354\243\274\354\260\250/study_week4_A_jwlee_Ji.py" create mode 100644 "03122_Ji/4\354\243\274\354\260\250/study_week_4_Q_seok.py" create mode 100644 "03122_Ji/5\354\243\274\354\260\250/QnA_Ji/study_week5_Ji_Q.py" 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" index 40f361a..5bc2197 100644 --- "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" @@ -92,5 +92,4 @@ def move_chessman(cmd): # 킹 이동 및 돌과 겹치면 돌 이동 moving_cmd = input() # 반복하는 횟수만큼 커맨드 입력받음 move_chessman(moving_cmd) -print(f'킹의 마지막 위치: {king.where()}') -print(f'돌의 마지막 위치: {dol.where()}') +print(king.where(),dol.where()) 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/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_3week_kimQ.py" "b/03122_Ji/3\354\243\274\354\260\250/study_3week_kimQ.py" deleted file mode 100644 index 2ed9ea8..0000000 --- "a/03122_Ji/3\354\243\274\354\260\250/study_3week_kimQ.py" +++ /dev/null @@ -1,8 +0,0 @@ -# 음료 주문 프로그램 - -# menu={'coffee':3500,'latte':4000,'smoothie':5000,'tea':3000} - -# 해당 딕셔너리를 활용하여 음료 주문을 하는 GUI프로그램을 생성한다. -# 창 제목은 음료 주문 프로그램이라고 작성한다. -# exit버튼을 누르면 터미널에 음료 주문 프로그램을 종료했다는 문구와 함께 프로그램 창을 종료시킨다. -# 창에는 메뉴판에 있는 메뉴명을 기재하며 각 메뉴 버튼을 누르면 하단에 총 금액과 총 가격에 반영되도록 이벤트를 설정한다. 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" index 0b8c7ed..8b53296 100644 --- "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" @@ -10,3 +10,14 @@ # [[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/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" index 8b889dc..c09434a 100644 --- "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" @@ -1,6 +1,6 @@ # 1 def solution(order): - num_list = list(str(order)) + num_list = str(order) answer = 0 for num in num_list: if num in '369': @@ -8,10 +8,12 @@ def solution(order): print(answer) return answer -# 2 +# 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 \ No newline at end of file + return answer + +print(solution('01064289769')) \ 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" index ad8508a..4d36a8b 100644 --- "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" @@ -1,17 +1,200 @@ +''' +내장 함수 문제 +''' + # 1 -print(abs(-5)) +print(f'1: {abs(-5)}') # 2 전부 true numbers = [True, True, False] -print(all(numbers)) +print(f'2: {all(numbers)}') # 리스트에 숫자 0있으면 False,'':False? # 3 numbers = [0, 0, 1] -print(any(numbers)) +print(f'3: {any(numbers)}') # 4 words = ["a", "b", "c"] -print(list(enumerate(words))) +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/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_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 From 1a4fb22466c96bb9731de79f8f7228e3de8296c0 Mon Sep 17 00:00:00 2001 From: yeyeyeyeyeyeun Date: Tue, 11 Feb 2025 16:34:04 +0900 Subject: [PATCH 09/13] upload_week5_A_Ji --- .../QnA_Ji/study_week5_Ji_A.py" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 "03122_Ji/5\354\243\274\354\260\250/QnA_Ji/study_week5_Ji_A.py" 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..043fa41 --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/QnA_Ji/study_week5_Ji_A.py" @@ -0,0 +1,34 @@ +# 풀이 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 \ No newline at end of file From a507ab55374b4e2a3d70d91aa653b9f091145ba8 Mon Sep 17 00:00:00 2001 From: yeyeyeyeyeyeun Date: Sat, 15 Feb 2025 12:57:43 +0900 Subject: [PATCH 10/13] week5_As_Ji --- .gitignore | 1 + 03117_bae/main.py | 7 -- .../5\354\243\274\354\260\250/python_A_Ji.py" | 87 +++++++++++++++++ .../5\354\243\274\354\260\250/python_Q.md" | 41 ++++++++ .../study_kim_5week_A_Ji.py" | 12 +++ .../study_week5_A_jwlee.py" | 85 ++++++++++++++++ .../study_week_5_A_seok.py" | 96 +++++++++++++++++++ README.md | 2 - virtual/src/webcam_add_save.py | 45 +++++++++ virtual/src/webcam_start.py | 39 ++++++++ 10 files changed, 406 insertions(+), 9 deletions(-) create mode 100644 .gitignore delete mode 100644 03117_bae/main.py create mode 100644 "03122_Ji/5\354\243\274\354\260\250/python_A_Ji.py" create mode 100644 "03122_Ji/5\354\243\274\354\260\250/python_Q.md" create mode 100644 "03122_Ji/5\354\243\274\354\260\250/study_kim_5week_A_Ji.py" create mode 100644 "03122_Ji/5\354\243\274\354\260\250/study_week5_A_jwlee.py" create mode 100644 "03122_Ji/5\354\243\274\354\260\250/study_week_5_A_seok.py" delete mode 100644 README.md create mode 100644 virtual/src/webcam_add_save.py create mode 100644 virtual/src/webcam_start.py 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/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..4d5cffd --- /dev/null +++ "b/03122_Ji/5\354\243\274\354\260\250/study_week5_A_jwlee.py" @@ -0,0 +1,85 @@ +# ; 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. +# ; 수포자는 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])) \ 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/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 From 0d83c4a45573198795087ec7b68d3dbc2c2c0a6b Mon Sep 17 00:00:00 2001 From: yeyeyeyeyeyeun Date: Mon, 17 Feb 2025 23:23:30 +0900 Subject: [PATCH 11/13] practice_array_bfs --- .../QnA_Ji/study_week5_Ji_A.py" | 8 +- .../array_bfs_practice/color_block.py" | 23 ++++ .../array_bfs_practice/detect.py" | 60 +++++++++ .../array_bfs_practice/game_map.py" | 117 ++++++++++++++++++ .../array_bfs_practice/minsu.py" | 99 +++++++++++++++ .../study_week5_A_jwlee.py" | 5 +- 6 files changed, 310 insertions(+), 2 deletions(-) create mode 100644 "03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/color_block.py" create mode 100644 "03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/detect.py" create mode 100644 "03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/game_map.py" create mode 100644 "03122_Ji/5\354\243\274\354\260\250/array_bfs_practice/minsu.py" 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" index 043fa41..f85f7d4 100644 --- "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" @@ -31,4 +31,10 @@ def solution(s): # 2-3. s[0]에 들어있는 공백을 가져옴 -> 원래 문자열과 동일한 구성이 되도록함 현재 answer: 'for ' # 이를 반복해서 answer에 계속 저장함 (answer에 문자가 계속 쌓임) - return answer \ No newline at end of file + return answer + +# title() : 맨앞이 숫자면 그다음 맨앞이 대문자 나머지 소문자자) +# capitalize() + +# split() +# ' '.join \ 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..33a1b82 --- /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/study_week5_A_jwlee.py" "b/03122_Ji/5\354\243\274\354\260\250/study_week5_A_jwlee.py" index 4d5cffd..1ce8a85 100644 --- "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" @@ -82,4 +82,7 @@ def solution(answers): return result -print(solution([1,2,3,4,5])) \ No newline at end of file +print(solution([1,2,3,4,5])) + + +# pop 을 하면 시간 복잡도가 높아진다. \ No newline at end of file From 123937cfabaed07671bc7b6cca422c079e091c16 Mon Sep 17 00:00:00 2001 From: yeyeyeyeyeyeun Date: Tue, 18 Feb 2025 22:02:55 +0900 Subject: [PATCH 12/13] upload week6 QnA Ji --- .../array_bfs_practice/detect.py" | 2 +- .../QnA_Ji/study_week6_Ji_Q.py" | 99 +++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 "03122_Ji/6\354\243\274\354\260\250/QnA_Ji/study_week6_Ji_Q.py" 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" index 33a1b82..45079f6 100644 --- "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" @@ -1,5 +1,5 @@ import numpy as np -# from collections import deque +from collections import deque map_design = np.array([ [ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0], 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..80ce0d8 --- /dev/null +++ "b/03122_Ji/6\354\243\274\354\260\250/QnA_Ji/study_week6_Ji_Q.py" @@ -0,0 +1,99 @@ +# 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 합니다. +''' + +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 From 66f69ec34725f7043c8557b750bf96807dad48fb Mon Sep 17 00:00:00 2001 From: yeyeyeyeyeyeun Date: Tue, 18 Feb 2025 22:04:52 +0900 Subject: [PATCH 13/13] new file: "03122_Ji/6\354\243\274\354\260\250/QnA_Ji/study_week6_Ji_A.py" modified: "03122_Ji/6\354\243\274\354\260\250/QnA_Ji/study_week6_Ji_Q.py" --- .../QnA_Ji/study_week6_Ji_A.py" | 29 +++++++++++++++++ .../QnA_Ji/study_week6_Ji_Q.py" | 31 +------------------ 2 files changed, 30 insertions(+), 30 deletions(-) create mode 100644 "03122_Ji/6\354\243\274\354\260\250/QnA_Ji/study_week6_Ji_A.py" 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" index 80ce0d8..27929a0 100644 --- "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" @@ -67,33 +67,4 @@ "ryan"이 "con"을 4번 신고했으나, 주어진 조건에 따라 한 유저가 같은 유저를 여러 번 신고한 경우는 신고 횟수 1회로 처리합니다. 따라서 "con"은 1회 신고당했습니다. 3번 이상 신고당한 이용자는 없으며, "con"과 "ryan"은 결과 메일을 받지 않습니다. 따라서 [0, 0]을 return 합니다. -''' - -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 +''' \ No newline at end of file