코딩테스트 연습 Lv.1 마무리 2

김채원·2023년 2월 21일
0

coding_test

목록 보기
11/11

오늘도 힘내서...ㅠㅠ!!!
절대 안 쉬겠다했는데 어제 장렬히 쉼...
눈찜질이랑 안마기 엄청 써줬더니 그나마 낫네요....
8시간 모니터 보고 하는 수업은 피로도가 진짜 상당한...ㅠㅠ


Lv.1

옹알이(2)

틀린 코드

테케 55점...끙....

def solution(babbling):
    answer = 0
    possible = ["aya", "ye", "woo", "ma"]
    
    for i in range(len(babbling)):
        for j in possible:
            if j in babbling[i]:
                babbling[i] = babbling[i].replace(j, '', 1)
        if babbling[i] == '':
            answer += 1
            
    return answer

수정 코드

  1. if v*2 not in i 로 연속된 같은 발음이 없도록 체크해야한다.
  2. 발음을 치환할때 ‘ ‘로 하지않고 ”로 치환하면 yayae 같은 경우, aya를 치환 후 남은 문자열이 ye되어 ye도 치환되는 경우가 발생하여 오답을 야기.
def solution(babbling):
    answer = 0
    possible = ["aya", "ye", "woo", "ma"]
    
    for i in babbling:                  
        for v in possible:                
            if v*2 not in i:            
                i=i.replace(v,' ')      #' '으로 발음을 치환
        if i.strip()=='':               #치환 완료된 문자열의 공백을 제거하고 ''와 같다면
            answer+=1
    
    return answer

[카카오 인턴] 키패드 누르기

맞긴 했으나...^^ 이런 노가다식 코드는...ㅎㅎㅎ;;;
라고 생각했는데 남들 답도 비슷하네

def solution(numbers, hand):
    answer = ''
    # left, right 현재 손가락 좌표 표시하는 변수
    left = (3,0)
    right = (3,2)
    # 0~9의 좌표를 미리 만들기
    dic = {1:(0,0),2:(0,1),3:(0,2),4:(1,0),5:(1,1),
           6:(1,2),7:(2,0),8:(2,1),9:(2,2),0:(3,1)}
    # 2,5,8,0 좌표에서 left,right를 각각 빼서 크기 비교
    for num in numbers:
        x,y = dic[num]
        if num in [1,4,7]:
            answer+='L'
            left = (x,y) #위치 갱신
        elif num in [3,6,9]:
            answer+='R'
            right = (x,y) #위치 갱신
        else:
            #sum(abs(x,y - 두손의 현 좌표 각각)) 
            xl,yl = left
            xr,yr = right
            distance_l = abs(x-xl)+abs(y-yl)
            distance_r = abs(x-xr)+abs(y-yr)
            #if min()
            #크기 동등하면 hand에 있는 쪽으로 기록
            if distance_l==distance_r:
                answer += hand[0].upper()
                if hand[0].upper()=='L':
                    left = (x,y)
                else:
                    right = (x,y)
            elif min(distance_l,distance_r)==distance_l:
                answer+='L'
                left = (x,y) #위치 갱신
            else:
                answer+="R"
                right = (x,y) #위치 갱신
            
    return answer

크레인 인형뽑기 게임

이거 처음에 board 형식이 감이 안 잡혀서 한참 헤맸다.

이런 식으로 생각해야 풀리는 문제;

def solution(board, moves):
    answer = 0
    result = []
    for idx in moves:
        idx -= 1
        for row in range(len(board)):
            if board[row][idx] != 0 :
                result.append(board[row][idx])
                if len(result)>=2 and result[-1]==result[-2]:
                    result.pop()
                    result.pop()
                    answer += 2
                board[row][idx] = 0
                break                 
   
    return answer

신규 아이디 추천

정규표현식이랑 strip 둘 다 써봄

import re

def solution(new_id):
    answer = ''

    new_id = new_id.lower()
    new_id = re.sub(r"[^a-z0-9\-_.]", "", new_id)
    new_id = re.sub('\.+', '.', new_id)	
    new_id = new_id.strip('.')
    new_id = 'a' if len(new_id) == 0 else new_id[:15]
    new_id = re.sub('^[.]|[.]$', '', new_id)
    if len(new_id) <= 2: 
        answer += (3-len(new_id))*new_id[-1]
    
    return new_id+answer

마지막 부분을 한줄코딩으로 더 이쁘게 하셨다.

import re

def solution(new_id):
    st = new_id
    st = st.lower()
    st = re.sub('[^a-z0-9\-_.]', '', st)
    st = re.sub('\.+', '.', st)
    st = re.sub('^[.]|[.]$', '', st)
    st = 'a' if len(st) == 0 else st[:15]
    st = re.sub('^[.]|[.]$', '', st)
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
    return st

문자열 나누기

from collections import deque

def solution(s):
    ans = 0
    q = deque(s)    
    
    while q:
        a, b = 1, 0
        x = q.popleft()    
        while q:
            n = q.popleft()
            if n == x:
                a += 1
            else:
                b += 1

            if a == b:
                ans += 1
                break
    if a != b:
        ans += 1

    return ans
profile
잡다한 공부 기록용

0개의 댓글