본문 바로가기

코딩테스트 준비/프로그래머스

[프로그래머스] 조이스틱

반응형

 

 

 

안녕하세요~

27년차 진로탐색꾼 조녁입니다!

1일 1코테 24일차! 고득점 Kit 에서 탐욕법(그리디) 테마 문제 풀어보았습니다.

 

제가 이번주부터 알바를 시작해서 이제야 올리네요!

그래도 월요일이랑 화요일 한 문제씩 풀어봤는데 포스팅을 못했습니다.

 

이번주부터는 답을 절대안보기로해서 다 못풀어도 일단 올려두고 다시 풀려고 합니다!

 

 

· 문제명 : 조이스틱

· 사용 언어 : Python3

· 난이도 : Level2

· 문제 설명 

programmers.co.kr/learn/courses/30/lessons/42860

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr

 

오답코드

def solution(name):
    #알파벳 : ABCDE / FGHIJ / KLMNO / PQRST / UVWXY / Z
    # a -> N 이면 반대로, M 이면 그대로
    
    answer = 0
    for i in name:
        #각 자리마다 최적의 이동수
        answer += min((26-abs(ord("A")-ord(i))), abs(ord("A")-ord(i)))
        
        
    #자리수 최적이동계산
    #예외처리 : [1:] 에서 "A"가 몇개나 연속되는 지 확인하고 싶음!!
    # 앞부분에 개수만큼 이득 / 뒷부분은 맨뒤에가 A아니면 이득 없음
    if name[1:-1] == "A"*(len(name)-2):
        answer +=1
    elif name[-1] == "A":
        answer +=len(name)-2
    elif name[1] =="A":
        answer +=len(name)-2
    else:
        answer +=len(name)-1
    return answer
    

 

위 코드는 90.9점이 나왔다. 11번째 케이스가 실패가 떴다. 다시 풀어봐야겠다.

다시 풀떄는 자리수 최적이동계산을 위치 이동으로 계산해봐야겠다.

 

오답코드 2 

def solution(name):
    #알파벳 : ABCDE / FGHIJ / KLMNO / PQRST / UVWXY / Z
    # a -> n이면 반대로, m이면 그대로
    answer = 0
    for i in name:
        #각 자리마다 최적의 이동수
        answer += min((26-abs(ord("A")-ord(i))), abs(ord("A")-ord(i)))
    
    #자리수 최적이동계산
    #두가지 경우 : 첫번째 -> 방향, 두번째 <- 방향
    
    for i in name:
         if i !="A":
            name = name.replace(i,"1")
    name = name.replace("A","0")
    
    #예외가 뭐가 있을까 왼쪽으로 갔는데 min 이 시작점일 때가 오류다. -> 맨앞을 잘라서 해결함
    name = list(name)[1:]
    idx = []
    
    for i in range(len(name)):
        if name[i] =="1":
            idx.append(i)
            
    answer += min(max(idx)+1,1+abs(len(name)-1-min(idx)))
    
    return answer

    #오답 사유 : 한쪽으로만 이동할 수 있는 것이 아니다!!

 

위 코드도 케이스 11에서 막혔는데 , 오답 사유를 찾았다. 바로 한쪽으로만 이동하지 않는 다는 것이다.

 

예를들어 ABAAAAAACD 와 같은 경우는 -> , <- , <- ,<- 으로 이동하는 것이 최소 동선이다. 하지만 왼쪽으로 이동하거나 오른쪽으로만 이동하는 코드를 짠다면 이 예시는 맞출 수 없다.

 

내일은 다른 방법으로 풀어야지.

 

https://link.coupang.com/a/rGILU

 

[한빛미디어]이것이 취업을 위한 코딩 테스트다 with 파이썬

COUPANG

www.coupang.com

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

반응형