둘 만의 암호
# 무식하게 풀이
def solution(s, skip, index):
# 알파벳 리스트를 구성
alphabet = list('abcdefghijklmnopqrstuvwxyz')
문자열은 remove가 되지 않기 때문에 alphabet를 리스트 형태로 만들었음.
# skip을 돌면서 알파벳 리스트에서 삭제
for i in skip:
alphabet.remove(i)
skip에 있는 문자를 alphabet 리스트에서 제거.
# 결과를 저장할 result 리스트 초기화
answer = []
for i in s:
# 현재 문자가 알파벳 리스트에서 몇번째 인덱스인지 저장
cur_index = alphabet.index(i)
# index 변수에 입력된 값만큼 더해주면 됨
# 더한 결과가 스킵을 반영한 알파벳 리스트의 길이를 넘어갈 수 있으므로, 알파벳 리스트의 크기로 나눠준 나머지를 구함
# 문제의 "index 만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다." 제한사항을 처리한 것
new_index = (cur_index + index) % len(alphabet)
answer.append(alphabet[new_index])
# 결과는 문자열로 출력되어야 하므로 join 해준다
return ''.join(answer)
주석에도 써놨지만 이 부분은 '구하려는 문자의 인덱스 + 입력된 index 변수' 가 리스트의 총 길이를 벗어나는 경우를 처리하는 것이 중요함.
전체 alphabet 리스트의 길이만큼 나눈 나머지를 구하면 해결.
이후 join을 통해 answer 리스트의 인자들을 문자열 형태로 합쳐 반환.
# 둘만의 암호
# 우선 알파벳 리스트에서 skip의 각 인자를 제거
# s 문자열의 각 문자의 인덱스를 구해 + index 해주고 저장한 뒤 출력
# 무식하게 풀이
def solution(s, skip, index):
# 알파벳 리스트를 구성
alphabet = list('abcdefghijklmnopqrstuvwxyz')
# skip을 돌면서 알파벳 리스트에서 삭제
for i in skip:
alphabet.remove(i)
# 결과를 저장할 result 리스트 초기화
answer = []
for i in s:
# 현재 문자가 알파벳 리스트에서 몇번째 인덱스인지 저장
cur_index = alphabet.index(i)
# index 변수에 입력된 값만큼 더해주면 됨
# 더한 결과가 스킵을 반영한 알파벳 리스트의 길이를 넘어갈 수 있으므로, 알파벳 리스트의 크기로 나눠준 나머지를 구함
# 문제의 "index 만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다." 제한사항을 처리한 것
new_index = (cur_index + index) % len(alphabet)
answer.append(alphabet[new_index])
# 결과는 문자열로 출력되어야 하므로 join 해준다
return ''.join(answer)
전체 코드
개선 사항
- 문자열을 리스트로 바꿔 remove할 필요 없이 replace를 활용하면 됨.
- 굳이 answer을 리스트로 만들고 나중에 join할 필요가 없었음.
# replace 사용, 더 간단하게
# 사실 answer로 리스트를 사용할 필요도 없음
def solution(s, skip, index):
answer = ''
alphabet = 'abcdefghijklmnopqrstuvwxyz'
for i in skip:
if i in alphabet:
alphabet = alphabet.replace(i, '')
for i in s:
change = alphabet[(alphabet.index(i) + index) % len(alphabet)]
answer += change
return answer
두번째 풀이
그냥 문자를 가져와 answer에 추가해주면 됨.
컴퓨터 구조
개념을 배우면서 실제로 데스크탑 사양을 체크해봤다.
- 메인보드 : 컴퓨터의 중심 회로판. 다른 모든 부품이 연결되고 소통하는 역할.
- CPU : 컴퓨터의 두뇌 역할. 연산과 명령 처리를 담당. 클럭 속도와 코어 수에 따라 성능이 결정됨.
- GPU : 그래픽 렌더링과 관련된 연산을 전문적으로 처리. 게임, 그래픽 디자인, 비디오 편집, 딥러닝 등에서 사용.
- RAM : 휘발성 메모리로, 현재 사용 중인 데이터를 임시로 저장. 용량이 클수록 더 많은 프로그램 동시 실행.
- 파워 서플라이 : 컴퓨터에 전원을 공급하는 장치.
- 입력 장치 : 사용자로부터 데이터를 받아 컴퓨터로 전달.
ex) 키보드, 마우스, 터치스크린, 마이크, 카메라, 컨트롤러
- 출력 장치 : 컴퓨터가 처리한 데이터를 사용자에게 전달.
ex) 모니터, 프린터, 스피커, 헤드폰/이어폰, 프로젝터
N과 M(1)
# N과 M(1)
N, M = map(int, input().split())
s = []
def dfs(n, m):
# s 리스트의 길이가 m과 같다면 수열이 완성된 것이므로 출력
if len(s) == m:
print(' '.join(map(str, s)))
return
# 1 부터 n까지 돌면서 수열을 생성
for i in range(1, n + 1):
# s에 해당 인자가 없다면 추가 후 재귀 호출
if i not in s:
s.append(i)
dfs(n, m)
# 숫자를 제거하여 백트래킹
s.pop()
dfs(N, M)
재귀적인 방법으로 푸는 문제.
s 라는 전역변수 리스트를 초기화.
함수 내부 반복문에서 1부터 N까지의 수를 돌며 s에 없다면 추가, 이후 재귀 호출
s의 길이가 m과 동일해지면 해당 수열을 출력하고 반환 후 하나의 호출를 종료하면서 pop을 하게 된다.
헷갈려서 메모장에 그리면서 풀어봤음.
N과 M(2)
# N과 M(2)
N, M = map(int, input().split())
s = []
def dfs(n, m):
# s 리스트의 길이가 m과 같다면 수열이 완성된 것이므로 출력
if len(s) == m:
print(' '.join(map(str, s)))
return
# s가 비어있지 않은 경우 수열 마지막 값 + 1
if s:
start = s[-1] + 1
# s가 비어있는 경우 1부터 시작
else:
start = 1
# start 부터 n까지 돌면서 수열을 생성
for i in range(start, n + 1):
s.append(i)
dfs(n, m)
s.pop()
dfs(N, M)
비슷하지만 중복된 수열은 출력하지 않아야 함.
예를 들어 1 3이 출력되었다면 3 1은 후에 출력되어서는 안되는 것.
반복문을 진행할 때 비교하는 자신보다 큰 수에 대해서만 연산을 하면 된다.
그러기 위해 start 변수를 따로 생성하여 비교하는 자기자신 +1 한 값부터 반복하면 됨.
i = 1일 때 재귀를 호출하여 1 2, 1 3, 1 4 까지 출력한다면, 다음 i = 2일 때는 2보다 1 큰 수인 3부터 시작하여 2 3, 2 4만 출력하게 되는 것.
오늘의 회고
cs주차가 시작되었다. 첫날이기도 하고 팀원분들도 새로 만나다보니 조금 얼타는 느낌이 있었다.
뭐부터 해야하는지, 어디를 마무리하고 넘어가야 하는지 몰라서 시간을 잘 활용하지 못했다.
앞으로 수업듣는 시간과 혼자 공부하는 시간을 잘 나누어 계획을 짜야겠다.
그래도 목표한 만큼은 성공.
내일의 목표는 코드카타 + 내일 특강 잘 듣고 따로 복습 + 스쿼드 숙제 풀기
'매일 TIL' 카테고리의 다른 글
[내일배움캠프 6-1일] 코드카타, 프로토콜, TCP/IP 4계층 (0) | 2024.07.29 |
---|---|
[내일배움캠프 5-5일] 코드카타, 객체지향 프로그래밍, SW 개발 방법론 (0) | 2024.07.26 |
[내일배움캠프 5-3일] 동적 계획법, 유기농 배추 리뷰 (2) | 2024.07.24 |
[내일배움캠프 5-2일] 스쿼드 문제, A->B (0) | 2024.07.23 |
[내일배움캠프 5-1일] 스쿼드 문제, dfs, bfs, 섬 개수 세기 (1) | 2024.07.22 |