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

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

by 머킹 2023. 9. 18.
728x90

파이썬으로 풀어보는 코딩테스트 Lv.0

안녕하세요 머킹입니다.

오늘부터 코딩테스트를 하나하나 준비하고자 합니다.

제가 지금부터 이루고 싶은 목표들을 하나씩 세분화해서 진행하려고 하는데요.

 

  • 팀 프로젝트
  • 개인 프로젝트
  • 유튜브 강의
  • 알고리즘
  • 공부

이 다섯 개로 분류시켜서 진행하고자 합니다.

너무 많은 것들을 하면 오히려 하나도 제대로 못하는 상황이 발생해서..

하나씩 되는대로 꼼꼼하게 마무리하려고 합니다.

 

그래서 오늘부터는 코딩테스트를 준비하고자 하는데요.

저는 정말 정말 초보이기 때문에

Lv.0단계부터 서서히 풀어나가는 모습을 기록하고자 합니다.


코딩테스트 복잡도


복잡도란, 알고리즘의 성능을 나타내는 척도입니다. 

동일한 기능을 수행하는 알고리즘 중 일반적으로 복잡도가 낮을수록 더 좋은 알고리즘이라고 할 수 있습니다.

1) 시간 복잡도: 알고리즘을 위해 필요한 연산의 횟수  
2) 공간 복잡도: 알고리즘을 위해 필요한 메모리의 양

 

코딩테스트에서는 그냥 코딩을 잘하는 것도 중요하지만!

효율적으로 코딩을 하는 것이 중요합니다.

 

그리고 코딩테스트에서 1등으로 100점을 받는 것이 목표가 아니라,

저희의 목적은 '통과'를 해서 2차 면접을 가는 것이니까

무조건 100점 아니면 안 돼 이런 생각은 접어도 괜찮을 것 같습니다.

 

코딩테스트 언어 선택?

https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/

 

카카오 신입 공채 1차 코딩 테스트 문제 해설

‘블라인드’ 전형으로 실시되어 시작부터 엄청난 화제를 몰고 온 카카오 개발 신입 공채. 그 첫 번째 관문인 1차 코딩 테스트가 지난 9월 16일(토) 오후 2시부터 7시까지 장장 5시간 동안 온라인

tech.kakao.com

코딩 테스트는 다양한 언어를 사용할 수 있는데요.

보통 자신이 자신 있는 언어를 사용하고는 합니다.

하지만, 많은 분들이 그렇듯 저 또한 파이썬을 추천합니다.

 

위 글처럼 코드 라인 수가 압도적으로 적은 효율적인 언어이기 때문입니다.

  • 코드 라인 수: C++ > 자바 > 자바스크립트 > 파이썬

따라서 주 언어가 없으시다면 파이썬을 강추! 합니다.

 

이제부터 문제풀이를 적어보겠습니다.

문제 - 풀이 - 해설 식으로 풀어나가겠습니다.

 


수열과 쿼리 처리

문제 설명
정수 배열 `arr`와 2차원 정수 배열 `queries`이 주어집니다. 

`queries`의 원소는 각각 하나의 `query`를 나타내며, `[s, e, k]` 꼴입니다.

각 `query`마다 순서대로 `s` ≤ `i` ≤ `e`인 모든 `i`에 대해 `i`가 `k`의 배수이면 `arr[i]`에 1을 더합니다.

위 규칙에 따라 `queries`를 처리한 이후의 `arr`를 return 하는 solution 함수를 완성해 주세요.

아무래도, 처음 코딩테스트를 보면 문제 설명이 가장 어려운 것 같아요..

하지만 겁먹지 말고 문제를 풀어봅시다.

def solution(arr, queries):
    result = arr.copy()
    
    for query in queries:
        s, e, k = query
        for i in range(s, e + 1):
            if i % k == 0:
                result[i] += 1
    
    return result
  1. result 배열을 초기화하기 위해 입력 배열 arr를 복사합니다.
  2. 이렇게 하면 result 배열은 arr과 동일한 내용을 가지게 됩니다.
  3. queries 배열을 순회합니다. queries는 각각 [s, e, k] 형식의 배열을 요소로 가집니다. 현재 순회 중인 query 배열에서 s, e, k 값을 추출합니다.
  4. s는 범위의 시작 인덱스, e는 범위의 끝 인덱스, k는 배수를 나타냅니다.
  5. s부터 e까지의 범위를 반복하며 인덱스 i를 사용합니다.  e + 1을 사용하는 이유는 범위의 끝 값을 포함하기 위함입니다.
  6. 현재 인덱스 i가 k의 배수인지 확인합니다.  i % k는 i를 k로 나눈 나머지를 계산하는 연산입니다. 만약 i가 k의 배수라면 나머지가 0이 됩니다.
  7. 만약 i가 k의 배수라면, result 배열의 해당 인덱스 i의 값을 1 증가시킵니다. 이렇게 하면 arr 배열의 해당 원소가 1씩 증가하게 됩니다.

배열 만들기 2

문제 설명
정수 `l`과 `r`이 주어졌을 때, `l` 이상 `r`이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.

제한사항
- 1 ≤ `l` ≤ `r` ≤ 1,000,000

 

내 코드

def solution(l, r):
    answer = []
    
    for num in range(l, r + 1):
        if all(digit in "05" for digit in str(num)):
            answer.append(num)
            
    return answer if answer else[-1]


`for` 루프를 사용하여 `l`부터 `r`까지의 범위 내의 모든 정수를 하나씩 확인합니다.
`range(l, r + 1)`은 `l`부터 `r`까지의 정수를 나열한 것입니다.

각 정수를 문자열로 변환하고, 그 문자열의 각 자릿수를 하나씩 확인합니다.
`for digit in str(num)`부분은 각 자릿수를 하나씩 검사하는 역할을 합니다. 
그리고 `digit in "05"`는 각 자릿수가 "0" 또는 "5"인지 확인하는 조건입니다. 
만약 모든 자릿수가 "0" 또는 "5"로 이루어져 있다면, 아래 코드 블록이 실행됩니다.

마지막으로, 만약 `answer` 배열이 비어있다면 
(즉, 숫자 "0"과 "5"로만 이루어진 정수가 없다면), 
`-1`을 담은 배열을 반환합니다. 그렇지 않으면 `answer` 배열을 반환합니다.

 

 

[보면서 되게 웃기고 신박했던 풀이]


카운트 업

문제 설명
정수 `start_num`와 `end_num`가 주어질 때, 

`start_num`부터 `end_num`까지의 숫자를 차례로 담은 리스트를 return 하도록 solution 함수를 완성해 주세요.

 

내 코드

def solution(start_num, end_num):
    answer = []
    for num in range(start_num, end_num + 1):
        answer.append(num)
        
    return answer


`for` 루프를 사용하여 `start_num`부터 `end_num`까지의 범위를 반복합니다. 
`range(start_num, end_num + 1)`은 `start_num`부터 `end_num`까지의 정수를 순서대로 생성하는 범위를 나타냅니다. 
`end_num + 1`을 사용하는 이유는 `end_num`을 포함하기 위함입니다.

각 숫자 `num`을 `answer` 리스트에 추가합니다. 
이렇게 하면 `start_num`부터 `end_num`까지의 모든 숫자가 `answer` 리스트에 차례로 담기게 됩니다.