728x90

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

출처 : 프로그래머스

 

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

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

programmers.co.kr

def solution(n, arr1, arr2):
    answer = []
    tmp1 = []
    tmp2 = []
    
    # arr1 수를 이진수로 바꾸기
    for i in range(len(arr1)):
        tmp = ''
        while True:
            if arr1[i]==0:
                while len(tmp)!=n:
                    tmp+='0'
                tmp1.append(tmp[::-1])
                break
            tmp += str(arr1[i]%2)
            arr1[i]//=2
            
    # arr2 수를 이진수로 바꾸기
    for i in range(len(arr2)):
        tmp = ''
        while True:
            if arr2[i]==0:
                while len(tmp)!=n:
                    tmp+='0'
                tmp2.append(tmp[::-1])
                break
            tmp += str(arr2[i]%2)
            arr2[i]//=2

    for i in range(n):
        tmp = ''
        for j in range(n):
            if tmp1[i][j] == '1' or tmp2[i][j] == '1':
                tmp += '#'
            else:
                tmp += ' '
        answer.append(tmp)
                
    return answer

 

풀이 1

10진수를 2진수로 만드는 방법을 10진수를 계속 2로 나눠줘서 나머지를 구하는 방식으로 했다.

거의 빡구현이다.

계속 반복문이 반복되는 부분을 느꼈지만, 일단 풀어봤다.

 

다른 사람들의 풀이를 보고 너무 짧아서 놀랐다.

 

def solution(n, arr1, arr2):
    answer = []
    for i,j in zip(arr1,arr2):
        arr = str(bin(i|j))[2:] # 둘 중에 하나라도 있으면 (비트 연산..)
        arr = arr.rjust(n,'0') # 0으로 채워주기
        arr = arr.replace('1','#')
        arr = arr.replace('0',' ')
        answer.append(arr)
    return answer

풀이 2

python 내장 함수를 사용하는 풀이다.

arr = str(bin(i|j))[2:] # 둘 중에 하나라도 있으면 (비트 연산..)
arr = arr.rjust(n,'0') # 0으로 채워주기

bin () 함수는 10진수를 2진수로 변환해주는 함수이다.

bin(n) 을 출력해보면 0b01001처럼 앞에 '0b' 가 붙어서 나온다.

이는 문제에서 쓸모없으니 슬라이싱해준다.

 

rjust() 함수는 rjust(자릿수, 채워줄 값)의 옵션을 갖고 있다.

오른쪽 정렬을 하고 자릿수까지 남는 값을 채워줄 값으로 채워주는 함수다.

 

bin으로 10진수를 2진수로 바꾸고 남는 앞자리 수는 모두 0으로 채워줘야 하는데, 

이를 rjust() 함수로 해결한 것이다.

 

그리고 arr1, arr2를 zip으로 묶어줬다.

또한, arr1과 arr2에서 하나라도 벽이면 벽이다. 이는 비트 연산 | 을 이용했다.

 

728x90

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

 

코딩테스트 연습 - 최대공약수와 최소공배수

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의

programmers.co.kr

출처 : 프로그래머스


def gcd(a,b):
    if a<b:
        a,b = b,a
    while b!=0:
        a,b = b, a%b
    return a

def solution(n, m):
    answer = []
    answer.append(gcd(n,m))
    answer.append(n*m//gcd(n,m))
    return answer

풀이

유클리드 호제법 알고리즘이다.

최대공약수는 math.gcd(n,m) 으로 구할 수도 있다.

최소공배수는 n*m//gcd(n,m) -> 즉, 두 수의 곱에 두 수의 최대공약수를 곱한 값과 같다.

728x90

https://programmers.co.kr/learn/courses/30/lessons/12926#

출처 : 프로그래머스

 

코딩테스트 연습 - 시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀

programmers.co.kr


def solution(s, n):
    s = list(s)
    for i in range(len(s)):
        if s[i].isupper(): # 대문자면
            s[i] = chr( (ord(s[i])-ord('A')+n) % 26 + ord('A'))
        elif s[i].islower() : # 소문자면
            s[i] = chr( (ord(s[i])-ord('a')+n) % 26 + ord('a'))
    return ''.join(s)

풀이

아스키코드를 활용한 파이썬 함수로 풀이했다.

이 부분은 아직 버벅이니 몇번더 풀어보자.

  • chr() :  아스키코드를 해당하는 문자열로 반환
  • ord() : 문자열에 해당하는 아스키코드 반환
728x90

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

출처 : 프로그래머스

 

코딩테스트 연습 - 이상한 문자 만들기

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을

programmers.co.kr


def solution(s):
    answer = ''
    i = 0 #각 단어 인덱스
    for ch in s:
        if ch == ' ': # 빈칸 체크
            answer += ch
            i = 0 # 빈칸이면 계속 단어 인덱스 0
        else: # 빈칸 아니면
            if i%2 == 0:
                answer += ch.upper()
            else:
                answer += ch.lower()
            i+= 1
    return answer
def solution(s):
    answer = ''
    for word in s.split(" "):
        n = ''
        for i in range(len(word)):
            if i%2 == 0:
                n += word[i].upper()
            else:
                n += word[i].lower()
        answer += (n+" ")
    return answer[:-1]

풀이

두 방법으로 풀었는데 비슷하다.

이 문제에서 주의할 점은 단어 사이의 공백이 하나만 있다는 것이 아니라는 점이다.

하나 이상의 공백을 갖고 있다.

그래서 모든 공백을 없애주고 하나의 공백으로만 문자열을 이어 붙이며 새로운 단어일 때 인덱스가 다시 0부터 시작하며 따져줘야 한다.

728x90

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

출처 : 프로그래머스

 

코딩테스트 연습 - 행렬의 덧셈

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요

programmers.co.kr

def solution(arr1, arr2):
    for i in range(len(arr1)):
        for j in range(len(arr1[i])):
            arr1[i][j] += arr2[i][j]
            
    return arr1

풀이 1

배열을 탐색하며 알맞는 인덱스를 더해줬다.

def solution(arr1, arr2):
    answer = [[c+d for c,d in zip(a,b)] for a,b in zip(arr1,arr2)]
    return answer

풀이 2

다른 사람의 풀이다.

zip을 써서 풀이했다..

2차원 배열 쌍이 나온다면 zip을 생각해보는 연습을 해봐야겠다.

728x90

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

 

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

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

programmers.co.kr

def solution(strings, n):
    # 인덱스 n의 문자가 같으면 사전순
    strings = sorted(strings, key = lambda x:(x[n],x))
    return strings

python의 sorted에서 key는 정말 유용하게 쓰이고 있다.

728x90

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

출처 : 프로그래머스

 

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

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

programmers.co.kr

def solution(arr):
    answer = [arr[0]]
    for i in range(len(arr)-1):
        if arr[i] != arr[i+1]:
            answer.append(arr[i+1])
    return answer

풀이 1

배열의 첫 번 째 값을 넣고 

배열의 앞부터 비교한다.

앞과 뒤 숫자가 다를 때만 answer에 추가한다.

def solution(arr):
    answer = []
    for i in arr:
        if answer[-1:] == [i]:
            continue
        answer.append(i)
    return answer

풀이 2

answer에 arr 숫자를 하나씩 넣는다.

answer에 마지막으로 넣은 숫자가 다음에 올 숫자와 같다면 continue

+ Recent posts