프로그래머스 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. 이어 붙인 문자열을 반환합니다.
되게 열심히 푼 것 같은데 아직 갈 길이 멀군요.
언젠가 제가 순수하게 코딩해서 푸는 날들이 오면 좋겠습니다.
'오늘부터 코딩테스트' 카테고리의 다른 글
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.26 |
---|---|
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.23 |
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.20 |
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.19 |
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.18 |