코딩테스트 연습 - 튜플

"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr

 

 

<내 코드>

 

def solution(s):
    answer = []
    s = list(eval(s[1:-1])) #문자열을 리스트로 변경
    
    if len(s) == 1:
        answer.append(s[0])
        
    else:
        temp = sorted(s, key=lambda x: len(x)) # 원소 개수별로 정렬
        temp = [list(i) for i in temp]  # 내부 집합 자료형을 리스트로 변경

        for item in temp:
            for j in range(len(item)):
                if item[j] not in answer:
                    answer.append(item[j])
                else:
                    continue
    return answer

 

반응형

 

 

코딩테스트 연습 - 크레인 인형뽑기 게임

[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4

programmers.co.kr

 

<내 코드>

 

def solution(board, moves):
    answer = 0
    basket = []
    cnt = 0
    
    for i in moves: # 열
        for j in range(len(board)):  # 행
            dall = board[j][i-1]
            
            if dall == 0:
                continue
            if dall != 0 and len(basket) == 0:
                board[j][i-1] = 0
                basket.append(dall)
                break
                
            elif dall != 0 and len(basket) != 0:
                board[j][i-1] = 0
                # 연속으로 같은 값인지 판단
                if basket[-1] == dall:
                    cnt += 2
                    basket.pop()
                else:
                    basket.append(dall)
                break

    answer = cnt                   
    return answer

스택을 이용해 현재 인형과 스택의 마지막 요소와 같은지 판단한다.

같으면 인형 2개가 터트려지고 카운트를 2올린다. 다르면 그대로 스택에 추가한다.

반응형

 

 

코딩테스트 연습 - 수식 최대화

IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과 �

programmers.co.kr

 

<다른 사람 코드>

def calc(priority, n, expression):
    if n == 2:  # 마지막 연산까지 마친 경우
        return str(eval(expression))
    if priority[n] == '*':
        res = eval('*'.join([calc(priority, n+1, e)
                             for e in expression.split('*')]))
    if priority[n] == '+':
        res = eval('+'.join([calc(priority, n+1, e)
                             for e in expression.split('+')]))
    if priority[n] == '-':
        res = eval('-'.join([calc(priority, n+1, e)
                             for e in expression.split('-')]))
    return str(res)


def solution(expression):
    answer = 0
    priorities = [
        ('*', '-', '+'),
        ('*', '+', '-'),
        ('+', '*', '-'),
        ('+', '-', '*'),
        ('-', '*', '+'),
        ('-', '+', '*')
    ]
    for priority in priorities:
        res = int(calc(priority, 0, expression))
        answer = max(answer, abs(res))

    return answer

 

eval(), join() 함수를 이용해 재귀 호출로 문제를 풀었다.

eval(문자열) : 문자열로 표현된 파이썬 식을 인수로 받아 결괏값을 주는 함수다.

' ? '.join(list) : 리스트에 특정 구분자를 포함해 문자열로 변환해준다.

 

문제의 접근법은 다음과 같다. 우선순위가 - >+ >* 라고 가정했을 때* 연산을 하기 위해서는 + 연산의 결괏값이 먼저 필요하다고 생각할 수 있다. 동일하게 + 연산을 하기 위해서는 - 연산의 결과값이 먼저 필요하다.

 

이런 이유로 인해 먼저 * 을 기준으로 수식을 쪼갠다. * 연산자는 우선순위가 가장 낮기 때문에 - , + 를 먼저 계산한 결괏값들을 가지고 마지막에 계산한다. 쪼개진 수식은 다시 같은 이유로 그다음 낮은 우선순위를 가지는 + 로 쪼갠다.

 

+ , * 로 쪼개진 수식들은 최종적으로 - 연산만 가진 수식이 되거나 그냥 숫자만 있는 수식이 되는데 이때 수식을 계산하고 값을 리턴한다. (그냥 숫자만 있는 수식은 그대로 리턴한다)

반응형

 

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때�

www.acmicpc.net

 

 

<내 코드>

 

n = int(input())
cnt = 0
for _ in range(n):
    s = input()
    done = [s[0]]
    for i in range(1, len(s)):
        if (s[i] != s[i-1] or s[i] == s[i-1]) and s[i] not in done:
            done.append(s[i])
        elif s[i] != s[i-1] and s[i] in done:
            done.append(-1)
            break
    if -1 not in done:
        cnt += 1

print(cnt)
반응형

+ Recent posts