조건문, 반복문을 응용한 문제들을 풀었습니다.

1. 마지막 두 원소


  • 정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.
  • 2 ≤ num_list의 길이 ≤ 10
  • 1 ≤ num_list의 원소 ≤ 9

num_list result
[2, 1, 6] [2, 1, 6, 5]
[5, 2, 1, 7, 5] [5, 2, 1, 7, 5, 10]
  • 입출력 예 #1
    • 마지막 원소인 6이 그전 원소인 1보다 크기 때문에 6 - 1인 5를 추가해 return합니다.
  • 입출력 예 #2
    • 마지막 원소인 5가 그전 원소인 7보다 크지 않기 때문에 5의 두 배인 10을 추가해 return합니다.

1
2
3
def solution(num_list):
    answer = []
    return answer

  • 배열의 각 원소에 접근하는 방법과, 이를 각각 추출해서 연산하는 방법을 이해해야 풀 수 있는 문제
  • 배열의 -1번째 원소와 -2번째 원소를 비교해서 조건에 따라 연산해야 함
  • 마지막 원소와 그 직전 원소를 각각 변수로 추출
  • 조건문에 따라 두 원소를 비교하여 연산하는 식 작

1
2
3
4
5
6
7
8
9
10
11
12
def solution(num_list):
    last = num_list[-1]  # 마지막 원소
    second_last = num_list[-2]  # 뒤에서 두 번째 원소
    
    # 마지막 원소가 이전 원소보다 크다면
    if last > second_last:
        num_list.append(last - second_last)
    # 마지막 원소가 이전 원소보다 작거나 같다면
    else:
        num_list.append(last * 2)
    
    return num_list
1
2
3
4
5
6
7
8
테스트 1
입력값 	[2, 1, 6]
기댓값 	[2, 1, 6, 5]
실행 결과 	테스트를 통과하였습니다.
테스트 2
입력값 	[5, 2, 1, 7, 5]
기댓값 	[5, 2, 1, 7, 5, 10]
실행 결과 	테스트를 통과하였습니다.

  • 배열의 길이에 상관없이 인덱싱을 하는 것을 알아야 풀 수 있음
  • 처음에는 각 배열에서 원소를 뽑아서 직전 원소와 비교하라는 것으로 잘못이해했었는데 문제를 찬찬히 읽지 않아서 생겼던 문제였음
  • 문제 자체에 이미 다 답이 나와 있었던 문제


2. 수 조작하기 1


  • 정수 n과 문자열 control이 주어집니다. control은 “w”, “a”, “s”, “d”의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.
    • “w” : n이 1 커집니다.
    • ”s” : n이 1 작아집니다.
    • “d” : n이 10 커집니다.
    • “a” : n이 10 작아집니다.

위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.

  • 100,000 ≤ n ≤ 100,000
  • 1 ≤ control의 길이 ≤ 100,000
    • control은 알파벳 소문자 “w”, “a”, “s”, “d”로 이루어진 문자열입니다.

n control result
0 “wsdawsdassw” -1

  • 수 n은 control에 따라 다음과 같은 순서로 변하게 됩니다.
  • 0 → 1 → 0 → 10 → 0 → 1 → 0 → 10 → 0 → -1 → -2 → -1
  • 따라서 -1을 return 합니다.

1
2
3
def solution(n, control):
    answer = 0
    return answer

  • control 에 주어진 문자열을 한개씩 체크하면서 정해진 조건에 따라 n의 값이 바뀌어야 함
  • 변수내 문자열을 iteration하는 방법과, 조건문, 산술연산을 할줄 알아야 풀 수 있는 문제
  • 입력받은 정수 n 을 answer에 할당한 뒤
  • control을 순회하며 각 문자열을 하나씩 추출
  • 추출된 문자열을 조건에 따라 일치여부를 확인한뒤 해당되는 연산을 하는 if~elif 문 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
def solution(n, control):
    answer = n
    # 조건에 따른 문자별 연산식
    for char in control:
        if char == "w":
            answer = answer + 1
        elif char == "s":
            answer = answer - 1
        elif char == "d":
            answer = answer + 10
        elif char == "a":
            answer = answer -10
    return answer
1
2
3
4
테스트 1
입력값 	0, "wsdawsdassw"
기댓값 	-1
실행 결과 	테스트를 통과하였습니다.

  • iteration하는 것에 대한 개념과 문자열로 된 변수내 문자들을 하나씩 추출해서 활용하는 방법을 알면 쉽게 풀 수 있는 문제


3. 수 조작하기 2


  • 정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 “w”, “a”, “s”, “d”로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.
    • “w” : 수에 1을 더한다.
    • ”s” : 수에 1을 뺀다.
    • “d” : 수에 10을 더한다.
    • “a” : 수에 10을 뺀다.
  • 그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.
  • 주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.
  • 2 ≤ numLog의 길이 ≤ 100,000
    • 100,000 ≤ numLog[0] ≤ 100,000
    • 1 ≤ i ≤ numLog의 길이인 모든 i에 대해 |numLog[i] - numLog[i - 1]|의 값은 1 또는 10입니다.

numLog result
[0, 1, 0, 10, 0, 1, 0, 10, 0, -1, -2, -1] “wsdawsdassw”

입출력 예 #1

  • result인 “wsdawsdassw”를 따라 numLog[0]에서부터 시작해 조작을 하면 numLog의 값과 순서대로 일치합니다. 따라서 “wsdawsdassw”를 return 합니다.
  • “수 조작하기 1” 문제의 n값이 numLog[0]에 해당하며, 이 문제에서 주어진 numLog에 따라 “수 조작하기 1” 문제의 control을 구하는 문제라고 이해할 수 있습니다.
  • 입출력 예 #1은 “수 조작하기 1” 문제의 입출력 예 #1과 같은 예시이므로 참고하시기 바랍니다.

1
2
3
def solution(numLog):
    answer = ''
    return answer

  • numLog의 배열은 특정 키(w, a, s, d) 를 누를 때마다 변화하는 숫자의 로그값
  • 배열의 첫번째 원소는 초기값이고, 그 다음 원소부터는 각 키(w,a,s,d)를 눌렀을때의 결과값을 의미하는 것
  • 주어진 numLog를 가지고 어떤 키들을 눌러서 그 로그값이 나오는지를 역으로 찾아야 되는 문제
  • answer 에 빈 문자열 생성
  • numLog의 첫번재 원소부터 (0번째는 제외) 마지막 원소까지 iteration하는 for문 작성
  • 현재원소와 이전 원소의 차이(diff)를 계산
  • diff로 어떤 값이 눌렸는지를 찾는 조건문을 작

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def solution(numLog):
    answer = '' # 정답을 담을 변수 생성
    # numLog 내 원소들을 순환 
    for i in range(1, len(numLog)):
        
        # 현재원소와 이전원소간의 차이를 계산
        diff = numLog[i] - numLog[i-1]
        
        # diff에 따라 눌려진 키 값을 추론
        if diff == 1:
            answer += 'w'
        elif diff == -1:
            answer += 's'
        elif diff == 10:
            answer += 'd'
        elif diff == -10:
            answer += 'a'
    return answer
1
2
3
4
테스트 1
입력값 	[0, 1, 0, 10, 0, 1, 0, 10, 0, -1, -2, -1]
기댓값 	"wsdawsdassw"
실행 결과 	테스트를 통과하였습니다.

  • 문제를 이해하는거 자체가 좀 어려웠던 것 같다. 입출력 예를 보고 이해가 되기보다 더 헷갈려져서 문제를 문장 별로 쪼개서 보면서 다시 이해했다.
  • 0번째 원소인 0을 제외하고 추론을 해야 하는데 이를 생각하지 못해서 애먹음
  • numLog는 12개의 원소이고 result는 11개의 문자인점을 빠르게 캐치했다면 더 빨리 문제를 풀 수 있었을텐데 아쉽다. (이런것도 EDA의 중요성의 일종인가 싶기도 하고..)


4. 수열과 구간 쿼리 3


  • 정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.
  • 각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.
  • 위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.
  • 1 ≤ arr의 길이 ≤ 1,000
    • 0 ≤ arr의 원소 ≤ 1,000,000
  • 1 ≤ queries의 길이 ≤ 1,000
    • 0 ≤ i < j < arr의 길이

arr queries result
[0, 1, 2, 3, 4] [[0, 3],[1, 2],[1, 4]] [3, 4, 1, 0, 2]
  • 입출력 예 #1
    • 각 쿼리에 따라 arr가 다음과 같이 변합니다.
    [0, 1, 2, 3, 4]
    [3, 1, 2, 0, 4]
    [3, 2, 1, 0, 4]
    [3, 4, 1, 0, 2]
  • 따라서 [3, 4, 1, 0, 2]를 return 합니다.

1
2
3
def solution(arr, queries):
    answer = []
    return answer

  • queries 처럼 2차원 배열에서 각 원소를 어떻게 추출하는지, 정수 배열에서 특정 원소의 값을 어떻게 바꾸는 지 알아야 풀 수 있는 문제
  • queries만큼 iteration하도록 for문을 작성
  • arr에서 바꿀 문자들을 queries에서 추출해서 query로 지정
  • query의 값들을 arr에서 찾아서 서로 교환하도록 코드 설정

1
2
3
4
5
6
7
8
def solution(arr, queries):
    # queries 만큼 순회
    for query in queries:
        # queries의 query를 추출
        i, j = query
        # arr에서 해당되는 숫자를 교환
        arr[i], arr[j] = arr[j], arr[i]
    return arr
1
2
3
4
테스트 1
입력값 	[0, 1, 2, 3, 4], [[0, 3], [1, 2], [1, 4]]
기댓값 	[3, 4, 1, 0, 2]
실행 결과 	테스트를 통과하였습니다.

  • 처음에 원소의 값을 바꾼다는 것을 이해를 잘 못해서 풀이 방법 정하는데 시간이 걸렸던 것 같다.


5. 수열과 구간 쿼리 2


  • 정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.
  • 각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.
  • 각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
  • 단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.
  • 1 ≤ arr의 길이 ≤ 1,000
    • 0 ≤ arr의 원소 ≤ 1,000,000
  • 1 ≤ queries의 길이 ≤ 1,000
    • 0 ≤ s ≤ e < arr의 길이
    • 0 ≤ k ≤ 1,000,000

arr queries result
[0, 1, 2, 4, 3] [[0, 4, 2],[0, 3, 2],[0, 2, 2]] [3, 4, -1]
  • 입출력 예 #1
    • 첫 번째 쿼리의 범위에는 0, 1, 2, 4, 3이 있으며 이 중 2보다 크면서 가장 작은 값은 3입니다.
    • 두 번째 쿼리의 범위에는 0, 1, 2, 4가 있으며 이 중 2보다 크면서 가장 작은 값은 4입니다.
    • 세 번째 쿼리의 범위에는 0, 1, 2가 있으며 여기에는 2보다 큰 값이 없습니다.
    • 따라서 [3, 4, -1]을 return 합니다.

1
2
3
def solution(arr, queries):
    answer = []
    return answer

  • queries 에 명시된 query 들이 통상적으로 검색조건 이므로 이들을 arr 의 idx로 이해를 하면 문제를 이해할 수 있다.
  • 각 query마다 순서대로 s ≤ i ≤ e인 모든 i 는 arr에서 arr[s]arr[e] 사이에 있는 원소를 의미한다.
  • 이제 arr 에서 query 로 추출한 조건에 맞는 i 중에 정수 k 보다 작은 원소값 중 가장 작은 값을 추출하면 되는 것
  • 이전 문제와 마찬가지로 queries를 순회하며 작업
  • queries에서 query를 추출해 각각 s, e, k를 추출
  • arr에서 s와 e를 활용해 조건을 충족하는 원소들 추출
  • 추출된 원소들중 k 보다 큰 원소만 추출
  • 추출된 값이 없으면 -1 을 answer 에 입력하고, 그렇지 않으면 min값을 answer에 입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(arr, queries):
    answer = []
    for query in queries:
        s, e, k = query
        # s와 e 인덱스에 해당하는 배열의 부분을 추출
        sub_arr = arr[s:e+1]
        
        # k보다 큰 값만 추출
        i_list = [i for i in sub_arr if i > k]
        
        # i_list가 비어있지 않으면 최소값을, 비어있으면 -1을 결과에 추가
        if i_list:
            answer.append(min(i_list))
        else:
            answer.append(-1)
            
    return answer
1
2
3
4
테스트 1
입력값 	[0, 1, 2, 4, 3], [[0, 4, 2], [0, 3, 2], [0, 2, 2]]
기댓값 	[3, 4, -1]
실행 결과 	테스트를 통과하였습니다.

  • 문제를 이해하는거 자체가 좀 어려웠던 문제
  • i를 어디서 찾는건지 잘 파악을 못해서 문제를 몇번씩 읽은것 같다.
  • 특히 s ≤ i ≤ e인 모든 i 이 부분이 이해가 안되서 계속 읽었는데 arr의 indxing을 하는 거란걸 좀 더 일찍 인지했으면 쉽게 풀지 않았을까 싶다.


댓글남기기