Skip to content
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CCTV_PJT/
7 changes: 0 additions & 7 deletions 03117_bae/main.py

This file was deleted.

18 changes: 18 additions & 0 deletions 03122_Ji/2주차/importantroad_ji.py
Original file line number Diff line number Diff line change
@@ -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개입니다.
# 도로를 통해 한 지점에서 다른 지점으로 이동하는 방법이 항상 존재합니다.

95 changes: 95 additions & 0 deletions 03122_Ji/2주차/kingQ_Ji.py
Original file line number Diff line number Diff line change
@@ -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())
30 changes: 30 additions & 0 deletions 03122_Ji/2주차/study_2week_kimQ_Ji.py
Original file line number Diff line number Diff line change
@@ -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.
'''
38 changes: 38 additions & 0 deletions 03122_Ji/2주차/study_week2_Q_jwlee_Ji.py
Original file line number Diff line number Diff line change
@@ -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
28 changes: 28 additions & 0 deletions 03122_Ji/2주차/문제/study_week2_A_ji.py
Original file line number Diff line number Diff line change
@@ -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 문 층이 많을수록 안좋다
13 changes: 13 additions & 0 deletions 03122_Ji/2주차/문제/study_week2_Q_ji.py
Original file line number Diff line number Diff line change
@@ -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
61 changes: 61 additions & 0 deletions 03122_Ji/3주차/QnA_Ji/study_week3_A_Ji.py
Original file line number Diff line number Diff line change
@@ -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))
Loading