본문 바로가기

매일 TIL

[내일배움캠프 5-4일] 코드카타 문제, CS 특강, 스쿼드 문제

둘 만의 암호

# 무식하게 풀이
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주차가 시작되었다. 첫날이기도 하고 팀원분들도 새로 만나다보니 조금 얼타는 느낌이 있었다.

뭐부터 해야하는지, 어디를 마무리하고 넘어가야 하는지 몰라서 시간을 잘 활용하지 못했다.

앞으로 수업듣는 시간과 혼자 공부하는 시간을 잘 나누어 계획을 짜야겠다.

그래도 목표한 만큼은 성공.

 

내일의 목표는 코드카타 + 내일 특강 잘 듣고 따로 복습 + 스쿼드 숙제 풀기