본문 바로가기
  • 머킹이의 머신로그
오늘부터 코딩테스트

[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기

by 머킹 2023. 9. 21.
728x90

프로그래머스 Lv.0단계 문제풀이 [Python]

안녕하세요 머킹입니다!

오늘도 프로그래머스 코딩테스트를 풀어보았습니다.

형태소를 비교해보고 싶어서 샘플 데이터 100개로 해보고 있는데

굉장히 느리네요..ㅎㅎ

 

아무튼 오늘의 문제 보겠습니다.

 


글자 이어 붙여 문자열 만들기

문제 설명
문자열 `my_string`과 정수 배열 `index_list`가 매개변수로 주어집니다. `my_string`의 `index_list`의 원소들에 해당하는 인덱스의 글자들을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

 

제한사항
- 1 ≤ `my_string`의 길이 ≤ 1,000
- `my_string`의 원소는 영소문자로 이루어져 있습니다.
- 1 ≤ `index_list`의 길이 ≤ 1,000
- 0 ≤ `index_list`의 원소 < `my_string`의 길이

 

def solution(my_string, index_list):
    answer = ''
    if index_list: # 순서대로 
        my_string #출력
    return answer

제 코드입니다.

아무래도 순서대로 출력하고 싶은데 감을 못 잡고 있습니다. index를 쓰는 건 맞는 것 같은데..

def solution(my_string, index_list):
    answer = ''
    for index in index_list:
        answer += my_string[index]
    return answer

네 index를 사용하는 것이 맞았습니다. 코드를 보니까 또 아하~ 하게 되는..

언제쯤 저 코드를 제대로 작성할지ㅎㅎ


9로 나눈 나머지


문제 설명
음이 아닌 정수를 9로 나눈 나머지는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것이 알려져 있습니다.  
이 사실을 이용하여 음이 아닌 정수가 문자열`number`로 주어질 때,

이 정수를 9로 나눈 나머지를 return 하는 solution 함수를 작성해 주세요.

 

제한사항
- 1 ≤ `number`의 길이 ≤ 100,000
- `number`의 원소는 숫자로만 이루어져 있습니다.
- `number`는 정수 0이 아니라면 숫자 '0'으로 시작하지 않습니다.

 

내 코드

def solution(number):
    answer = 0
    if 0 =< number:
        number들의 합 // 나머지
    else 0 > number:
        print(0)
    return answer

일단 코드를 모르더라도 제가 생각하는 알고리즘을 짜는 것으로 목표했습니다.

def solution(number):
    num = int(number)
    answer = 0
    while num > 0:
        answer += num % 10
        num //= 10
        
    return answer % 9

while 문을 사용해야 풀 수 있었습니다.

%10 은 왜 하는지 궁금해서 물어보니 이런 답변을 받았습니다.

 

실제로 숫자의 각 자리 숫자를 추출하기 위해서는 10으로 나눈 나머지를 구하여야 합니다. 이유는 10으로 나눈 나머지 연산(num % 10)을 사용하면 주어진 숫자의 가장 오른쪽 자리 숫자를 추출할 수 있기 때문입니다.

예를 들어, 숫자 123을 고려해 봅시다. 이 숫자를 10으로 나눈 나머지를 구하면 다음과 같습니다.

123 % 10 = 3

여기서 3은 123의 가장 오른쪽 자리 숫자입니다. 다음으로 123을 10으로 나눈 몫을 구하면 다음과 같습니다.

123 // 10 = 12

이제 12가 남았습니다.

이 과정을 반복하면 계속해서 가장 오른쪽 자리 숫자를 추출하고, 나머지 숫자를 업데이트할 수 있습니다.

따라서 각 자리 숫자를 구하려면 10으로 나눈 나머지를 더하는 것이 필요합니다.

그리고 이를 반복하여 각 자리 숫자의 합을 구할 수 있습니다.

 

def solution(number):
    return sum(list(map(int, number))) % 9

다른 사람 풀이 중에서 엄청 간단해 보이는 것을 발견했습니다. 신기하네요


문자열 여러 번 뒤집기


문제 설명
문자열 `my_string`과 이차원 정수 배열 `queries`가 매개변수로 주어집니다. `queries`의 원소는 [s, e] 형태로, `my_string`의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다. `my_string`에 `queries`의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.

 

제한사항
- `my_string`은 영소문자로만 이루어져 있습니다.
- 1 ≤ `my_string`의 길이 ≤ 1,000
- `queries`의 원소는 [s, e]의 형태로 0 ≤ s ≤ e < `my_string`의 길이를 만족합니다.
- 1 ≤ `queries`의 길이 ≤ 1,000

 

def solution(my_string, queries):
    my_string = list(my_string)
    
    for query in queries:
        s, e = query
        my_string[s:e+1] = my_string[s:e+1][::-1]
    return ''.join(my_string)

슬라이스를 정말 잘해야 한다는 생각이 듭니다..

그리고 join을 잘 쓰는 것도 정말 중요하다고 생각됩니다.

 


배열 만들기

 

문제 설명
문자열 배열 `intStrs`와 정수 `k`, `s`, `l`가 주어집니다. `intStrs`의 원소는 숫자로 이루어져 있습니다.
배열 `intStrs`의 각 원소마다 `s`번 인덱스에서 시작하는 길이 `l`짜리 부분 문자열을 잘라내 정수로 변환합니다. 이때 변환한 정수값이 `k`보다 큰 값들을 담은 배열을 return 하는 solution 함수를 완성해 주세요.

 

제한사항
- 0 ≤ `s` < 100
- 1 ≤ `l` ≤ 8
- 10l - 1 ≤ `k` < 10l
- 1 ≤ `intStrs`의 길이 ≤ 10,000

- `s` + `l` ≤ `intStrs`의 원소의 길이 ≤ 120

 

def solution(intStrs, k, s, l):
    answer = []
    for string in intStrs:
        sub_str = string[s:s + l]
        
        sub_int = int(sub_str)
        
        if sub_int > k:
            answer.append(sub_int)
    return answer

이 문제도 마찬가지로 슬라이싱이 정말 중요한 것 같습니다.

문자열을 이렇게 다뤄본 적은 처음이라서 되게 어려웠습니다.

 


부분 문자열 이어 붙여 문자열 만들기

 

문제 설명
길이가 같은 문자열 배열 `my_strings`와 이차원 정수 배열 `parts`가 매개변수로 주어집니다. `parts [i]`는 [s, e] 형태로, `my_string [i]`의 인덱스 s부터 인덱스 e까지의 부분 문자열을 의미합니다. 각 `my_strings`의 원소의 `parts`에 해당하는 부분 문자열을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

 

제한사항
- 1 ≤ `my_strings`의 길이 = `parts`의 길이 ≤ 100
- 1 ≤ `my_strings`의 원소의 길이 ≤ 100
- `parts [i]`를 [s, e]라 할 때, 다음을 만족합니다.
- 0 ≤ s ≤ e < `my_strings [i]`의 길이

 

def solution(my_strings, parts):
    my_strings.split("parts")
    # split을 사용하거나 if문..while문?
    answer = ''
    return answer

여기서 좀 헷갈린 부분이 split을 써야 하는 건지.. 헷갈렸습니다.

그리고 if 조건문을 써야 하는지 while을 써야하는지 모르겠습니다.

if문을 쓰는 게 더 맞는 것 같은데...

def solution(my_strings, parts):
    answer = []
    
    for i in range(len(my_strings)):
        s, e = parts[i]
        substring = my_strings[i][s:e+1]
        answer.append(substring)
        
    return ''.join(answer)

split은 쓰지 않고 for문을 사용하는 것이 정답이었습니다.

저 [s:e+1]이라는 문법이 정말 익숙해지지 않은 것 같습니다.

계속 복기해 봐야겠어요!

 

마지막 문제 해석이 헷갈려서 상세한 코드 설명을 가져왔습니다.

1. 먼저, 빈 리스트 `answer`를 생성합니다. 이 리스트에 추출한 부분 문자열을 저장할 것입니다.
2. `for` 루프를 사용하여 `my_strings`와 `parts`를 인덱스 `i`를 통해 동시에 순회합니다. 이렇게 하면 `i`번째 문자열과 `i`번째 부분 문자열에 접근할 수 있습니다.
3. `parts [i]`는 `[s, e]` 형태의 명령으로, `my_strings [i]` 문자열에서 `s`부터 `e`까지의 부분 문자열을 추출해야 합니다.
4. 추출한 부분 문자열을 `substring` 변수에 저장합니다. 이렇게 하면 `my_strings [i][s:e+1]`를 사용하여 부분 문자열을 추출합니다.
5. 추출한 부분 문자열 `substring`을 `answer` 리스트에 추가합니다. 이렇게 하면 각 문자열에 대한 부분 문자열이 차례로 `answer` 리스트에 추가됩니다.
6. 모든 문자열에 대해 위 과정을 반복하고, 최종적으로 `answer` 리스트에 저장된 부분 문자열들을 문자열로 이어 붙입니다.
7. 이어 붙인 문자열을 반환합니다.

 


되게 열심히 푼 것 같은데 아직 갈 길이 멀군요.

언젠가 제가 순수하게 코딩해서 푸는 날들이 오면 좋겠습니다.