211013 알고리즘

이은택·2021년 10월 13일
0

알고리즘

목록 보기
6/15
post-thumbnail

코드잇 파이썬 기초문제


배운것

Aliasing 관련 코드

x = [2, 3, 5, 7, 9]
y = x

y[2] = 11
x[4] = 13

print(y)

y의 값은 [2, 3, 11, 7, 9]가 아닌 [2, 3, 11, 7, 13]이였다. x값 여태껏 파이썬의 aliasing이라는 것을 모르고 있었던것에 정신충격이 좀 있었다. aliasing으로 인한 혼선을 피하려면 리스트를 지정할때 y = x가 아닌 y = list(x)라고 해야 y의 특정 인덱스 위치의 값이 바뀌어도 변수 x에 영향이 없다. x가 아닌 x값에 있는 값들을 따로 다시 지정한다고 보면 된다.


영어 단어장

# 1. 단어장 만들기
vocab = {
    # 코드를 입력하세요.
    "sanitizer": "살균제",
    "ambition": "야망", 
    "conscience": "양심",
    "civilization": "문명"
    
}
print(vocab)


# 2. 새로운 단어들 추가
# 코드를 입력하세요.
vocab.update({"privilege": "특권", "principle": "원칙"})
print(vocab)

사전 뒤집기

# 언어 사전의 단어와 뜻을 서로 바꿔주는 함수
def reverse_dict(dict):
    new_dict = {}  # 새로운 사전
    
    # dict의 key와 value를 뒤집어서 new_dict에 저장
    # 코드를 입력하세요.
    for key in dict:
        new_dict[dict[key]] = key
    
    return new_dict  # 변환한 새로운 사전 리턴


# 영-한 단어장
vocab = {
    'sanitizer': '살균제',
    'ambition': '야망',
    'conscience': '양심',
    'civilization': '문명',
    'privilege': '특권',
    'principles': '원칙'
}

# 기존 단어장 출력
print("영-한 단어장\n{}\n".format(vocab))

# 변환된 단어장 출력
reversed_vocab = reverse_dict(vocab)
print("한-영 단어장\n{}".format(reversed_vocab))

투표 집계하기

# 투표 결과 리스트
votes = ['김영자', '강승기', '최만수', '김영자', '강승기', '강승기', '최만수', '김영자', \
'최만수', '김영자', '최만수', '김영자', '김영자', '최만수', '최만수', '최만수', '강승기', \
'강승기', '김영자', '김영자', '최만수', '김영자', '김영자', '강승기', '김영자']

# 후보별 득표수 사전
vote_counter = {}

# 리스트 votes를 이용해서 사전 vote_counter를 정리하기
for name in votes:
    # 코드를 작성하세요.
    if name not in vote_counter:
        vote_counter[name] = 1
    else:
        vote_counter[name] += 1

# 후보별 득표수 출력
print(vote_counter)

자릿수 합 구하기

# 자리수 합 리턴
def sum_digit(num):
    # 코드를 입력하세요.
    sum = 0
    while num >= 10:
        sum += num % 10
        num //= 10
    return sum + num


# sum_digit(1)부터 sum_digit(1000)까지의 합 구하기
# 코드를 입력하세요.

sum = 0
for i in range(1,1001):
    sum += sum_digit(i)
print(sum)

✔다른 방식 1 - 정수형 문자형 변환

풀이

📌숫자를 문자열로 바꾼후 1의 자리 10의 자리 100의 자리 등등.. 각위치에 있는 문자를 숫자로 변환후 더해준다.

def sum_digit(num):
    # 코드를 입력하세요.
    sum = 0
    str_num = str(num) 📌
    for i in range(len(str_num)):
        sum += int(str_num[i])
    return sum

# sum_digit(1)부터 sum_digit(1000)까지의 합 구하기
# 코드를 입력하세요.
total_sum = 0
for num in range(1,1001):
    total_sum += sum_digit(num)
print(total_sum)

주민등록번호 가리기

def mask_security_number(security_number):
    # 코드를 입력하세요.
    if '-' in security_number:
        return security_number[:10] +"****"
    else:
        return security_number[:9] + "****"

# 테스트
print(mask_security_number("880720-1234567"))
print(mask_security_number("8807201234567"))
print(mask_security_number("930124-7654321"))
print(mask_security_number("9301247654321"))
print(mask_security_number("761214-2357111"))
print(mask_security_number("7612142357111"))

개선할 부분

  • 문자열 마지막에 있는 인덱스 4개의 위치에 접근을 하기 위해서 숫자 보다는 -숫자 로 접근을 하면 주민번호숫자사이에 있는 -의 여부에 영향 받지 않고 더 간결한 코드가 가능.
  • 문자열을 계산해서 특정부위만 따로 출력을 했는데 리스트사용해서 풀어보기

✔ 다른 방식 1 - 리스트사용

def mask_security_number(security_number):
    # 코드를 입력하세요.
    sec_num_list = []
    for i in range(len(security_number)):
        sec_num_list.append(security_number[i])
    for b in range(1,5):
        sec_num_list[-b] = "*"
    new_word = ""
    for r in range(len(security_number)):
        new_word += sec_num_list[r]
    return new_word

# 테스트
print(mask_security_number("880720-1234567"))
print(mask_security_number("8807201234567"))
print(mask_security_number("930124-7654321"))
print(mask_security_number("9301247654321"))
print(mask_security_number("761214-2357111"))
print(mask_security_number("7612142357111"))

✔ 다른 방식 2 - join사용

풀이

📌 리스트에 있는 값들을 for 루프를 사용하지 않고 내장함수join으로 한줄로 완성!

for 루프에서

for r in range(len(security_number)):
        new_word += sec_num_list[r]

join 함수

new_word = "".join(sec_num_list)

로 변경

def mask_security_number(security_number):
    # 코드를 입력하세요.
    sec_num_list = []
    for i in range(len(security_number)):
        sec_num_list.append(security_number[i])
    for b in range(1,5):
        sec_num_list[-b] = "*"
    new_word = "".join(sec_num_list)📌
    return new_word

# 테스트
print(mask_security_number("880720-1234567"))
print(mask_security_number("8807201234567"))
print(mask_security_number("930124-7654321"))
print(mask_security_number("9301247654321"))
print(mask_security_number("761214-2357111"))
print(mask_security_number("7612142357111"))

✔ 다른 방식 3 - 인덱스 '-숫자'로 접근

풀이

-숫자를 사용해 문자열 뒤에서 부터 4자리를 제외한 문자열과 제외한 문자열 숫자만큼 * 4개를 더한 값을 return 한다.

주의할점

-숫자 도 마찬가지로 문자열[x:-숫자]콜론뒤에있는 위치는 범위에 포함되지 않는다. 문자열[:-1]이라면 문자열에 있는 마지막 위치에 있는 부분인 문자열[-1]을 제외한 값을 의미한다.

def mask_security_number(security_number):
    # 코드를 입력하세요.
    return security_number[:-4] + "****"


# 테스트
print(mask_security_number("880720-1234567"))
print(mask_security_number("8807201234567"))
print(mask_security_number("930124-7654321"))
print(mask_security_number("9301247654321"))
print(mask_security_number("761214-2357111"))
print(mask_security_number("7612142357111"))

팰린드롬

def is_palindrome(word):
    # 코드를 입력하세요.
    for i in range(len(word) // 2):
        if word[i] != word[-1-i]:
            return False
    return True
# 테스트
print(is_palindrome("racecar"))
print(is_palindrome("stars"))
print(is_palindrome("토마토"))
print(is_palindrome("kayak"))
print(is_palindrome("hello"))

개선할 부분

  • 대칭되는 인덱스부분을 left right의 변수로 지정하면 코드 가독성이 높아짐

✔Code refactoring

변수이름 바꾸기

📌의미를 알기 힘든 i[-1-i] 대신에 leftright변수로 변경

def is_palindrome(word):
    # 코드를 입력하세요.
    for left in range(len(word) // 2): 📌
        right = - 1 - left
        if word[left] != word[right]:
            return False
    return True
# 테스트
print(is_palindrome("racecar"))
print(is_palindrome("stars"))
print(is_palindrome("토마토"))
print(is_palindrome("kayak"))
print(is_palindrome("hello"))

profile
도전!

0개의 댓글