https://programmers.co.kr/learn/courses/30/lessons/12921

 

코딩테스트 연습 - 소수 찾기

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상

programmers.co.kr


풀이 과정

일정 범위에 있는 모든 소수를 찾아야 하는 문제이다. 1부터 n까지의 수에 대해 모두 소수 판정을 하면서 개수를 세면 답이야 구해지겠지만 시간복잡도가 O(NrootN)인 방법이 되어 효율성 테스트를 통과할 수가 없다.

 

일정 범위에 있는 모든 소수를 찾아야 할 때는 에라토스테네스의 체를 사용하는게 효과적이다. 에라토스테네스의 체가 무엇인지 모르면 아래 위키백과를 참조하면 좋다.

 

https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서

ko.wikipedia.org

 

에라토스테네스의 체의 시간복잡도는 O(NloglogN)으로 더 효율적이다 N이 100만이라 할때 일일이 소수 판정을 하면 연산 횟수가 약 10억번 언저리까지 나올 수 있지만 에라토스테네스의 체로는 2천만번 언저리의 연산으로 해결이 가능하다.

 


소스 코드

def solution(n):
    answer = 0
    check = [False for _ in range(1000001)]
    prime = [] 

    for i in range(2, 1000001):
        if not check[i]:
            prime.append(i)
            for j in range(2*i, 1000001, i):
                check[j] = True

    for prime_number in prime:
        if prime_number > n:
            break
        else:
            answer += 1

    return answer

https://programmers.co.kr/learn/courses/30/lessons/12919

 

코딩테스트 연습 - 서울에서 김서방 찾기

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니

programmers.co.kr


풀이 과정

리스트에서 Kim을 찾고 Kim의 index가 어디있는지 문자열에 담아 출력해주면 되는 문제이다.

 

파이썬에서 index 함수를 사용하면 리스트에서 찾는 값이 몇 번째 index에 있는지 찾을수 있다.

 

예시)

seoul = [1, 'hello', b]

seoul.index('hello') = 1

 

index 함수를 활용하여 문제를 해결하였다.


소스 코드

def solution(seoul):
    return f"김서방은 {seoul.index('Kim')}에 있다"

https://programmers.co.kr/learn/courses/30/lessons/12918

 

코딩테스트 연습 - 문자열 다루기 기본

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다. 제한 사항 s는 길이 1

programmers.co.kr


풀이 과정

isdigit()으로 문자열이 숫자만으로 구성되어 있는지 확인할 수 있고, len()으로 특정 객체의 길이를 판별할 수 있다.

 

 


소스 코드

def solution(s):
    return len(s) in (4, 6) and s.isdigit()

https://programmers.co.kr/learn/courses/30/lessons/12917

 

코딩테스트 연습 - 문자열 내림차순으로 배치하기

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요. s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로

programmers.co.kr


풀이 과정

파이썬 내장함수를 사용해 문자열을 내림차순으로 배치해주면 문제의 모든 조건을 만족하게 된다.

 

문자열에서 바로 sort 사용은 불가능하니 문자열을 리스트로 바꾸고 sort를 사용한 다음에 다시 문자열로 바꿔주었다.


소스 코드

def solution(s):
    answer = list(s)
    answer.sort(reverse=True)
    answer = ''.join(answer)
    return answer

https://programmers.co.kr/learn/courses/30/lessons/12916

 

코딩테스트 연습 - 문자열 내 p와 y의 개수

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를

programmers.co.kr


풀이 과정

1. 문자열 s의 문자를 하나 하나 들여다 보면서 p, P를 인식시 p의 개수를 늘리고, y, Y를 인식시 y의 개수를 늘리면서 카운팅하는 것이 정석적인 풀이 방법이다.

 

파이썬 내장 함수를 좀 더 간결하게 해결할 수 있다.

 

2. lower()를 이용해 대문자를 전부 다 소문자로 바꾸고 count()로 p와 y의 개수를 세주고 같은지 체크해주면 된다


소스 코드

첫번째 방법

def solution(s):\
    count_p = 0
    count_y = 0
    for letter in s:
        if letter in ('p', 'P'):
            count_p += 1
        if letter in ('y', 'Y'):
            count_y += 1

    return count_p == count_y

 

두번째 방법

def solution(s):
    return s.lower().count('p') == s.lower().count('y')

https://programmers.co.kr/learn/courses/30/lessons/12915

 

코딩테스트 연습 - 문자열 내 마음대로 정렬하기

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱

programmers.co.kr


풀이 과정

파이썬의 lambda식을 이용해서 정렬하여 문제를 해결하였다.

 

list.sort(key=lambda x:x[n])식은 list의 n번째 인덱스로 리스트를 정렬해준다.

 

인덱스 n의 문자열이 같은 원소가 여럿일 경우, 사전순으로 배치해야 하므로 먼저 list.sort()로 사전순으로 정렬하고 인덱스 정렬을 시행하였다.


소스 코드

def solution(strings, n):
    strings.sort()
    strings.sort(key=lambda x:x[n])
    answer = strings
    return answer

https://programmers.co.kr/learn/courses/30/lessons/12912

 

코딩테스트 연습 - 두 정수 사이의 합

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다. 제한 조건 a와 b가 같은 경우

programmers.co.kr


풀이 과정

a, b를 보고 a가 b보다 크면 두 수를 서로 바꿔준 다음에 a ~ b까지의 누적 합을 구했다.

 

 


소스 코드

def solution(a, b):
    answer = 0
    if a > b:
        a, b = b, a
    answer = sum(range(a, b+1))
    return answer

https://programmers.co.kr/learn/courses/30/lessons/12910

 

코딩테스트 연습 - 나누어 떨어지는 숫자 배열

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하

programmers.co.kr


풀이 과정

중복이 없는 리스트가 들어왔을때 리스트 내의 원소중 divisor로 나누어 떨어지는 것들의 집합을 오름차순으로 반환해주면 된다. 단 나누어 떨어지는게 없으면 리스트에 -1을 담아 반환해야 한다.

 

그냥 문제가 시키는 대로 구현하면 된다. 리스트 내포와 삼항 연산자 문법을 사용하면 코드를 더욱 간략하게 구현할 수 있다.


소스 코드

def solution(arr, divisor):
    answer = [x for x in arr if x % divisor == 0]  # 리스트 내포
    answer.sort()
    return answer if answer else [-1]  # 삼항 연산자

https://programmers.co.kr/learn/courses/30/lessons/12906

 

코딩테스트 연습 - 같은 숫자는 싫어

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은

programmers.co.kr


풀이 과정

리스트에서 연속적으로 나오는 숫자를 제거한 리스트를 반환해주면 된다. 파이썬의 리스트에서 중복을 제거하는 방법은 list를 set 자료형으로 바꿨다가 다시 list로 바꾸는 방법이 널리 알려져 있지만, 이러면 list의 순서가 보존되지 않으므로 다른 방법을 이용해야 한다.

 

list내의 숫자를 하나하나씩 살펴보면서 이전에 살펴봤던 숫자와 같은 숫자이면 정답 list에 넣지 않고, 다른 숫자이면 정답 list에 넣는 방식으로 문제를 해결하였다.


소스 코드

def solution(arr):
    answer = []
    check = -1
    for number in arr:
        if check != number:
            answer.append(number)
            check = number
    return answer

https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr


풀이 과정

파이썬의 내장함수 bin()을 이용해서 십진수 숫자를 이진수 문자열로 바꿔주었다

ex) bin(9) -> '0b1001'

      bin(9)[2:] -> '1001'

 

지도의 한 변의 길이가 n이어야 하므로 문자열의 길이가 n 미만이면 문자열의 맨 앞에 0을 추가로 붙여준다

ex) '1001' -> '01001' (n = 5)

 

첫 째 지도, 둘 째 지도에서 위와 같은 방법으로 십진수를 이진수로 전환해주고, 양쪽 지도를 모두 살펴보면서 양쪽 지도 모두가 0이면 실제 지도에는 공백, 하나라도 1이면 실제 지도에는 '#'을 채워주면서 지도를 완성하고 출력해주면 된다.


소스 코드

def solution(n, arr1, arr2):
    answer = []
    arr1map = []
    arr2map = []

    for number in arr1:
        temp = bin(number)[2:]
        while len(temp) < n:
            temp = '0' + temp
        arr1map.append(temp)

    for number in arr2:
        temp = bin(number)[2:]
        while len(temp) < n:
            temp = '0' + temp
        arr2map.append(temp)

    for outer in range(n):
        temp_answer = []
        for inner in range(n):
            if arr1map[outer][inner] == '0' and arr2map[outer][inner] == '0':
                temp_answer.append(' ')
            else:
                temp_answer.append('#')
        answer.append(temp_answer)

    answer2 = []

    for array in answer:
        answer2.append(''.join(array))


    return answer2

+ Recent posts