[Programmers/Lv. 0] 코딩테스트 입문 Day 15 - 문자열, 해시, 배열, 수학 (Python)

2023. 5. 30. 09:39Algorithm

1. 영어가 싫어요


영어로 표시되어 있는 숫자를 수로 바꾸라는 문제이다. (예시: "onefourzerosixseven" -> 14067)

 

(내가 생각한 풀이 과정)

일차원 적으로 생각해서, 알파벳을 써놓은 문자열 리스트와 숫자를 써놓은 리스트를 각각 인덱스에 대응되게 만들어둔다.
그리고 알파벳 리스트를 하나씩 반복시키면서, 해당하는 문자열이 있는 경우에 replace() 함수를 이용해서 인덱스에 맞게 대응 후 바꿔주는 방법을 생각했다.

 

(코드)

더보기

💡 내 코드

def solution(numbers):
    alpha = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
    num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]

    for i in range(len(alpha)):
        if alpha[i] in numbers: 
            numbers = numbers.replace(alpha[i], num[i])

    return int(numbers)

 

💡 다른 사람의 풀이 코드

별도의 숫자 배열을 지정할 필요 없이 enumerate를 사용하면 대응하는 수를 구할 수 있다.
사실, enumerate도 사용할 것 없이 그 자체의 리스트 인덱스 수를 이용하면 0부터 9까지의 수를 대응시켰을 수도 있을 거다.

def solution(numbers):
    for num, eng in enumerate(["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]):
        numbers = numbers.replace(eng, str(num))
    return int(numbers)

 


2. 인덱스 바꾸기


문자열과 정수 num1과 num2가 주어질 때, 문자열의 인덱스 num1에 해당하는 문자와 인덱스 num2에 해당하는 문자를 바꾼 문자열을 반환하라는 문제이다.

 

(내가 생각한 풀이 과정)

문자열 슬라이싱 방법을 직관적으로 사용했다.

"num1 인덱스 전까지의 문자열 + num2 인덱스 문자 + num1 인덱스 이후부터 num2 인덱스 전까지의 문자열 + num1 인덱스 문자 + num2 인덱스 이후의 문자열"과 같이 문자를 연결하면, 새로운 문자를 반환할 수 있을 것이다.

 

(코드)

더보기

💡 내 코드

def solution(my_string, num1, num2):
    return my_string[:num1] + my_string[num2] + my_string[num1+1:num2] + my_string[num1] + my_string[num2+1:]

 

💡 다른 사람의 풀이 코드

파이썬의 동시할당이 가능하다는 특성을 이용해서 아래와 같은 코드를 써줄 수도 있겠다. 

def solution(my_string, num1, num2):
    s = list(my_string)
    s[num1],s[num2] = s[num2],s[num1]
    return ''.join(s)

 


3. 한 번만 등장한 문자


주어진 문자열에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 반환하라는 문제이다.
단, 한 번만 등장하는 문자가 없을 경우에는 빈 문자열을 반환하면 된다.
문자열은 소문자로만 이루어져 있다.

 

(내가 생각한 풀이 과정)

한 번만 등장한다고 문제 조건에서 제시되었을 때, 바로 떠올랐던 것은 집합(set) 자료형이다.
집합 자료형은 중복된 값이 들어갈 수 없다는 조건이 있기 때문이다.

즉, 주어진 문자열을 집합 자료형으로 설정한 후, 원래 주어진 문자열과 비교하여 count 값이 1인 경우에만 문자열에 join 시키면 문제를 쉽게 해결할 수 있을 것이라 생각했다.
"사전 순으로 정렬"한다는 조건이 있었기에 sorted() 함수를 이용해서 정렬도 해줘야 한다!

 

(코드)

더보기

💡 내 코드

def solution(s):
    set_s = set(s)
    return "".join(sorted([i for i in set_s if s.count(i) == 1]))

 


4. 약수 구하기


주어진 정수의 약수를 오름차순으로 담은 배열을 구하라는 문제이다.

 

(내가 생각한 풀이 과정)

1부터 주어진 정수까지 하나씩 반복하면서 나누어 떨어지는지 (%==0)를 구하면 되는 아주 쉬운 문제 ^__^

 

(코드)

더보기

💡 내 코드

def solution(n):
    return [i for i in range(1, n+1) if n % i == 0]