반응형

 

 

 

 

 

 

www.acmicpc.net/problem/5430

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

 

 

 

 

코드

n = (int)(input())

for i in range(n):
    funcstr = input()
    list_n = (int)(input())

    de = (str)(input())[1:-1].split(',')
    funcstr = funcstr.replace('RR','')

    if list_n == 0:
        de = []

    r_flag = 0
    flag = 1
    for j in range(len(funcstr)):
        if funcstr[j] == 'R':
            r_flag = not r_flag
        else:
            if len(de) == 0:
                print("error")
                flag = 0
                break

            if r_flag:
                de.pop(len(de)-1)
            else:
                de.pop(0)


    if flag == 1:
        if r_flag:
            de.reverse()
        print('[', end='')
        print(','.join(de), end='')
        print(']')

 

 

 

1. 양 옆의 '['와 ']'를 인덱싱으로 제거하고, 콤마를 기준으로 split() 

de = (str)(input())[1:-1].split(',')

 

 

2. 'RR'이면 다시 원상태이기 때문에 replace() 함수로 없애주었다.

funcstr = funcstr.replace('RR','')

 

3. 줄바꿈없이 print

print('[', end='')

 

 

4. 중간중간 콤마를 넣어 join

print(','.join(de), end='')

 

 

 

 

반응형
반응형

 

 

 

 

www.acmicpc.net/problem/1021

 

1021번: 회전하는 큐

첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가

www.acmicpc.net

 

 

파이썬 코드

from collections import deque

n, m = map(int, input().split())

deq = deque(i+1 for i in range(n))
li = list(map(int, input().split()))

sum = 0
for i in range(m):
    diff = deq.index(li[0])
    diff_rev = len(deq) - diff

    if diff == 0:
        li.pop(0)
        deq.popleft()
    elif diff < diff_rev:
        deq.rotate(-diff)
        sum += diff
        li.pop(0)
        deq.popleft()
    else:
        deq.rotate(diff_rev)
        sum += diff_rev
        li.pop(0)
        deq.popleft()

print(sum)

 

 

뽑아야 하는 값의 인덱스를 diff로, 전체 deque의 길이에서 diff를 뺀 값을 diff_rev로 놓았습니다.

diff가 0이면 뽑아야 하는 수가 가장 앞에 있다는 의미이므로 리스트와 deque에서 각각 값을 꺼냅니다.

diff 보다 diff_rev가 더 크면 deque를 오른쪽 방향으로 diff_rev 만큼 rotate 시킨 후 값을 꺼냅니다.

반대는 반대로 합니다.

 

 

 

 

 

 

반응형
반응형

 

 

 

이게 웬 난리.....

 

 

www.acmicpc.net/problem/1002

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

 

 

파이썬 코드

n = (int)(input())

for i in range(n):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())

    # 피타고라스 거리 : y
    y = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5
    rs = r1 + r2
    rm = abs(r1 - r2)

    if y == 0:
        if r1 == r2:
            print(-1)
        else:
            print(0)
    else:
        if rs == y or rm == y:
            print(1)
        elif rs > y and rm < y:
            print(2)
        else:
            print(0)

 

두 점이 같고, 거리도 같으면 완전히 원이 겹치기 때문에 -1

두 점이 같고, 거리는 다르면 겹치는 점이 하나도 없기 때문에 0

 

두 거리를 합한 값이 두 점 사이의 거리와 같거나(두 원이 맞닿아 만남),

두 거리의 차이가 두 점 사이의 거리와 같으면(한 원이 다른 원을 포함하면서 한 점에서 겹침)

한 점에서 만나기 때문에 1

 

두 거리의 합이 두 점 사이의 거리보다 크면서, 두 거리의 차이가 두 점 사이의 거리보다 작으면

두 점에서 만나기 때문에 2

=> 여기서 뒤에 조건을 설정해주지 않아 계속 틀렸는데요 ㅠㅠ

만약 두 거리의 차이가 두 점 사이의 거리보다 크면 한 원이 다른 원을 완전히 포함하기 때문에 만나는 점이 없습니다.

 

그 이외에서는 모두 0

 

 

 

 

새롭게 알게된 사실 )

제곱근 구할 때, 굳이 import math해서 구하지 않아도 ** 0.5 해주면 구할 수 있습니다..!

 

 

 

 

 

 

 

반응형
반응형

 

Asterisk

우리가 흔히 알고 있는 * 을 의미한다.

단순 곱셈, 제곱 연산, 가변 인자 활용 등 다양하게 사용된다.

 

가변 인자 활용 => 변수 여러 개를 packing하여 한번에 넘겨줄 때

def astarick_test(a, *args):
    print(a, args)
    print(type(args))

astarick_test(1,2,3,4,5,6)
def astarick_test(a, *args):
    print(a, args)
    print(type(args))

astarick_test(1,*(2,3,4,5,6))
1 (2, 3, 4, 5, 6)
<class 'tuple'>

 

*(2,3,4,5,6) = 2,3,4,5,6 이기 때문이다.

 

 

 

키, 밸류 값을 한번에 넘겨줄 때 => ** 을 쓴다.

def astarick_test(a, **karg):
    print(a, karg)
    print(type(karg))

astarick_test(1, b=2, c=3, d=4, e=5)
1 {'b': 2, 'c': 3, 'd': 4, 'e': 5}
<class 'dict'>

 

 

 

변수 여러 개를 unpacking할 때 

def astarick_test(a, args):
    print(a, *args)     # unpacking
    print(type(args))

astarick_test(1,(2,3,4,5,6))
1 2 3 4 5 6
<class 'tuple'>

 

 

 

 

이미 packing 되어있는 튜플에 asterisk를 하면 )

def asterisk_test(a, *args):
    print(a, args[0])
    print(type(args))

asterisk_test(1, (2, 3, 4, 5, 6))
1 (2, 3, 4, 5, 6)
<class 'tuple'>

 

args = ((2, 3, 4, 5, 6),) 가 된다. 따라서 args의 첫 번째 인덱스만 꺼내 주어야 한다.

 

 

 

 

일반적인 unpacking

a, b, c = ([1,2],[3,4],[5,6])
print(a,b,c)

data = ([1,2],[3,4],[5,6])      #unpacking
print(*data)
[1, 2] [3, 4] [5, 6]
[1, 2] [3, 4] [5, 6]

 

def asterick_test(a,b,c,d):
    print(a,b,c,d)

data = {"b":1,"c":2,"d":3}
asterick_test(10, **data)
10 1 2 3

 

 

for data in zip(*([1,2],[3,4],[5,6])):
    print(sum(data))
9
12

 

 

반응형

'AI > python' 카테고리의 다른 글

Pythonic Code - Set()  (0) 2021.01.15
Pythonic Code - Deque, Ordered Dict, Counter  (0) 2021.01.12
Pythonic Code - Lambda & MapReduce  (0) 2021.01.11
Pythonic Code - Enumerate, Zip  (0) 2021.01.10
Pythonic Code - List Comprehension  (0) 2021.01.10
반응형

 

 

 

 

 

Lambda는 함수를 다르게 쓴 것이라고 보면 된다.

f = lambda x, y: x + y
print(f(1,2))

f = lambda x: x ** 2
print(f(3))

f = lambda x: x / 2
print(f(4))

 

 

꼭 함수의 이름을 지정하지 않고도 사용할 수 있다.

print((lambda x: x+1)(5))

 

 

 

lambda에 필터 껴주기 

=> lambda에서 if 문 쓸 때에는 꼭 else도 써 주어야 한다.

# lambda에 필터 껴주기
a = list(map(lambda x: x ** 2 if x % 2 == 0 else x, ex))
print(a)
[1, 4, 3, 16, 5]

 

 

 

python 3에서는 list comprehension으로 편하게 쓸 수 있기 때문에 lambda의 사용이 권장되지 않는다.

b = [x ** 2 for x in ex]
print(b)
[1, 4, 9, 16, 25]

 

 

Reduce 

: 값을 하나하나 꺼내면서 수식 처리를 해 주는 것이다.

 

예시 ) 값을 하나하나 꺼내면서 더해준다.

# Reduce
from functools import reduce
print(reduce(lambda x,y: x+y, [1,2,3,4,5]))
15

 

 

 

예시 ) 값을 하나하나 꺼내면서 곱해준다.

def factorial(n):
    print(reduce(lambda x,y: x*y, range(1,n+1)))

factorial(4)
24

 

 

 

 

 

 

 

 

 

반응형

'AI > python' 카테고리의 다른 글

Pythonic Code - Deque, Ordered Dict, Counter  (0) 2021.01.12
Pythonic Code - asterisk  (0) 2021.01.12
Pythonic Code - Enumerate, Zip  (0) 2021.01.10
Pythonic Code - List Comprehension  (0) 2021.01.10
파이썬 기초 끝 ! + map 함수  (0) 2021.01.10
반응형

 

 

 

 

www.acmicpc.net/problem/4153

 

4153번: 직각삼각형

입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.

www.acmicpc.net

 

 

 

세 수 중 가장 큰 값을 maxInt에 넣어놓고 리스트에서 그 값을 뺀다.

나머지 두 수의 제곱의 합이 maxInt와 같으면 right, 다르면 wrong을 출력한다.

 

while(True):
    listA = list(map(int, input().split()))

    if sum(listA) == 0:
        break

    maxInt = max(listA)
    listA.remove(maxInt)

    if listA[0] ** 2 + listA[1] ** 2 == maxInt ** 2:
        print('right')
    else:
        print("wrong")

 

 

 

새로 알게된 사실 )

list 이름을 list로 하면 안된다 ! 당연히 안 되는 건데 왜 썼는지 모르겠다 ㅋㅋ

그리고 max(list), sum(list) !!

 

 

 

 

 

반응형

+ Recent posts