[Programmers/Lv. 0] 코딩테스트 입문 Day 14 - 조건문, 반복문, 시뮬레이션, 문자열 (Python)

2023. 5. 29. 09:31Algorithm

1. 가까운 수


정수 배열과 정수 n이 매개변수로 주어질 때, 정수 배열에 들어있는 수 중에서 n이랑 가장 가까운 수를 반환하라는 문제이다.
단, 가장 가까운 수가 여러 개일 경우에는 더 작은 수를 반환한다.

 

(내가 생각한 풀이 과정)

처음에 떠오른 방법은 주어진 정수 배열에 있는 요소들을 모두 n을 뺀 후에 절댓값(abs)을 씌워 가장 작은 수를 찾으면 된다는 생각이었다.

단, 여기서 주어진 제한사항 때문에 문제가 하나 생긴다.
가장 가까운 수가 여러 개일 경우에는 더 작은 수를 반환하라는 조건이 있기에 이를 충족시킬 코드가 필요했다.

그래서 생각한 것이 배열을 먼저 크기 순서대로 정렬하는 것과 (오름차순),
절댓값을 구하는 배열과 정렬 배열을 따로 구분해, 절댓값이 가장 작은 수를 구하면 이를 원래 정렬 배열에서 인덱스로 접근하는 방법이었다.

말로 하니까 조금 복잡한데, 아래 코드를 보면 이해를 할 수 있다.

 

(코드)

더보기

💡 내 코드

def solution(array, n):
    s_array = sorted(array)
    n_array = [abs(num-n) for num in s_array]
    return s_array[n_array.index(min(n_array))]

 


2. 369 게임


숫자가 주어지면, 369게임 (3, 6, 9의 개수만큼 박수를 치는 게임)과 같이 쳐야 할 박수 횟수를 구하라는 문제이다.

 

(내가 생각한 풀이 과정)

주어진 정수를 문자열로 파악해서, 문자 하나씩 반복시키고, 369가 들어있는 경우에 count 변수를 1씩 증가시켰다.

 

(코드)

더보기

💡 내 코드

def solution(order):
    count = 0
    for i in str(order):
        if i in "369": count += 1
    return count

 

💡 다른 사람의 풀이 코드

다른 사람의 풀이 코드를 보면, 나와 마찬가지로 문자열 변환과 count 함수를 사용한 것은 같지만,
map과 lambda를 사용해서 코드를 한 줄로 깔끔하게 정렬한 것이 특징이다.

def solution(order):
    return sum(map(lambda x: str(order).count(str(x)), [3, 6, 9]))

 


3. 암호 해독


문자열 cipher와 정수 code가 주어질 때,
code의 배수번째 글자만 cipher 문자열에서 추출한 문자열을 반환하라는 문제이다.

 

(내가 생각한 풀이 과정)

range 함수의 매개변수를 적극 활용했다.
이때 배수는 1부터 시작, 인덱스는 0부터 시작하는 특성이 있기 때문에 1만 빼주고 첫 번째 매개변수에 추가했다.

 

(코드)

더보기

💡 내 코드

def solution(cipher, code):
    return ''.join([cipher[i] for i in range(code-1, len(cipher), code)])

 

💡 다른 사람의 풀이 코드

이 코드를...보니까 내가 굳이 왜 반복을 돌렸는지... 모르겠다.
생각해 보니까 문자열 자체에서 이런 식으로 추출해도 충분히 가능한 문제였는데...

def solution(cipher, code):
    return cipher[code-1::code]

 


4. 대문자와 소문자


문자열이 매개변수로 주어질 때, 대문자는 소문자로, 소문자는 대문자로 변환한 문자열을 반환하라는 문제이다.

 

(내가 생각한 풀이 과정)

마찬가지로 문자를 하나씩 반복시키면서 isupper() 함수로 문자가 대문자인지 소문자인지 파악하여,
대문자인 경우에는 lower() 함수로 소문자를 만들고, 소문자인 경우에는 upper() 함수로 대문자를 만들면 된다고 생각했다.

 

(코드)

더보기

💡 내 코드

def solution(my_string):
    return "".join([ch.lower() if ch.isupper() == True else ch.upper() for ch in my_string])

 

💡 다른 사람의 풀이 코드

파이썬에서는 swapcase()라는 영문 대소문자를 상호 전환하는 내부 메서드가 있다. 

def solution(my_string):
    return my_string.swapcase()