코딩테스트 연습 - 튜플

"{{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)
반응형

 

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

 

<내 코드>

 

s = input()
alpha = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="]

for i in alpha:
    s = s.replace(i, '*')

print(len(s))

 

str.replace(바뀌게 될 문자열, 바꿀 문자열)처럼 사용해서 문자열 안의 특정한 값을 다른 값으로 치환해 준다.

반응형

 

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

 

 

<내 코드>

 

s = input().lower()

words = list(set(s))
arr = []
for i in words:
    arr.append(s.count(i))

if arr.count(max(arr)) >= 2:
    print('?')
else:
    print(words[arr.index(max(arr))].upper())
반응형

 

 

2675번: 문자열 반복

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다

www.acmicpc.net

 

<내 코드>

 

T = int(input())
for _ in range(T):
    R, S = input().split()
    R = int(R)
    result = ""
    for i in range(len(S)):
        result += S[i] * R
    print(result)
반응형

 

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

 

<내 코드>

 

T = int(input())
for _ in range(T):
    case = input()
    cnt = 0
    for i in case:
        if i == '(':
            cnt += 1
        elif i == ')':
            cnt -= 1

        if cnt < 0:
            print("NO")
            break
    if cnt == 0:
        print("YES")
    elif cnt > 0:
        print("NO")

 

반응형

+ Recent posts