728x90
반응형

문제:

풀이방법:

 효율적으로 풀어야 하는 문제이기 때문에 O(N^2) 방법으로는 시간초과에 걸릴 것이다. 따라서 투 포인터를 사용하는 슬라이딩 윈도우를 사용해서 풀었다. 

 우선 앞에서부터 뒷 포인터를 이동시키면서 모든 보석을 포함할 때까지 이동한다. 모든 보석을 포함하게 된다면 앞 포인터를 움직여서 가장 앞에 존재했던 보석을 뺀다. 그래도 모든 보석이 포함되어 있다면 앞 포인터를 움직여서 다시 앞을 빼고, 모든 보석이 포함되어 있지 않다면 뒷 포인터를 움직여서 다시 모든 보석을 포함시킬 때까지 움직인다. 

이 과정을 반복하면서 가장 짧은 길이의 포인터들을 저장해두고 최종적으로 출력하도록 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
def solution(gems):
    answer = []
    initGems = len(set(gems))
    
    gemCount = {}
    gemSet = set()
    
    start,answerStart = 00
    last,answerLast = 00
    diff = 999999999
    swLast = -1
    
    for s in range(len(gems)):
        findsw = False
        for l in range(swLast+1,len(gems)):
            if len(gemSet) == initGems:
                findsw = True
                if abs(l-s-1< diff:
                    diff = abs(l-s-1)
                    answerStart = s
                    answerLast = l-1
                swLast = l-1
                break
            if not gemCount.get(gems[l]):
                gemCount[gems[l]] = 1
                gemSet.add(gems[l])
            else:
                gemCount[gems[l]] +=1
        if not findsw:
            if len(gemSet) == initGems:
                findsw = True
                if abs(l-s) < diff:
                    diff = abs(l-s)
                    answerStart = s
                    answerLast = l
                swLast = l
            break
 
        if gemCount.get(gems[s]):
            if gemCount[gems[s]]==1:
                del gemCount[gems[s]]
                gemSet.remove(gems[s])
            else:
                gemCount[gems[s]] -=1
                
    answer.append([answerStart+1,answerLast+1])
    return answer[0]
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/67258

 

코딩테스트 연습 - 보석 쇼핑

["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7]

programmers.co.kr

 

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]18258. 큐2  (0) 2020.07.23
[BOJ]4963. 섬의 개수  (0) 2020.07.21
[BOJ]2164. 카드2  (0) 2020.07.14
[Programmers]2020 카카오 인턴십. 수식 최대화  (0) 2020.07.09
[Programmers]2020 카카오 인턴십. 키패드 누르기  (0) 2020.07.07
728x90
반응형

문제:

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다.

 

이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 아래에 있는 카드 밑으로 옮긴다.

 

예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 남는 카드는 4가 된다.

 

N이 주어졌을 때, 제일 마지막에 남게 되는 카드를 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 정수 N(1<=N<=500,000)이 주어진다.

출력:

첫째 줄에 남게 되는 카드의 번호를 출력한다.

풀이방법:

빠른 입출력을 위해서 collections의 deque를 사용했다. 스택과 큐의 기능을 한번에 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
import sys
from collections import deque
 
N=int(sys.stdin.readline())
cards = deque(int(i+1for i in range(N))
 
while len(cards) !=1:
    cards.popleft()
    cards.append(cards.popleft())
    
print(cards.pop())
cs

문제링크:

https://www.acmicpc.net/problem/2164

 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

 

728x90
반응형
728x90
반응형

Abstract

Multimodal Sentiment Analysis(이하 msa)는 최근 인기를 얻고 있는데 그 이유는 social media가 발전하고 있기 때문이다.

이 논문에서는 msa의 세 가지 면을 소개한다.

  1. 얼마나 많은 modality가 sentiment에 기여하는지
  2. 장기 의존성을 해결할 수 있는지
  3. unimodal의 fusion과 cross modal cue

이 세가지 면에서 cross modal interaction을 배우는 것이 이 문제를 해결하는데 효과적인 것을 알 수 있었다.

CMU-MOSI나 CMU-MOSEI 데이터셋에서 좋은 성능을 보였다.

1. Introduction

Facebook, Whatsapp, Instagram and YouTube와 같은 소셜 미디어들이 발전하면서 sentiment analysis가 중요해졌다. msa는 acoustic, visual, textual를 같이 사용한다.

msa를 하는 방법에는 다음 세 가지 타입이 있다.

  1. modality를 각각 학습하고 output을 fuse 하는 방법
  2. 여러 개의 modality를 jointly 학습하는 방법
  3. attention based technique을 사용해서 각 unimodal들이 얼마나 기여하는지 알아보는 방법

그래서 더 나은 cross modal information을 배우기 위해서 cross interaction 동안 정보를 조절하는 conditional gating mechanism을 제안한다.

게다가 video에서 장기 의존성을 잡기 위해서 각 unimodal contextual representation에 self-attention layer를 적용한다. self-attention을 사용하는 장점은 direct interaction을 가능하게 하고, network에서 제한없는 information flow를 제공한다.

논문에서 제안하는 방법에서 중요한 것은 다음과 같다.

  1. cross interaction간에 정보를 조절할 수 있는 gating mechanism을 배운다.
  2. self-attend가 장기 의존성을 잡을 수 있다.
  3. self 및 gated 기반의 recurrent layer는 더 정확한 multimodal을 얻을 수 있다.

2. Proposed Approach

학습가능한 gate에 의해 조절되는 서로 다른 modality사이에 interaction을 배우는 것이 목적이다. 전체적인 구조는 아래와 같다.

2.1 Contextual Utterance Representation

Bi-GRU를 통해서 각 modality에서 specific contextual representation을 얻는다. 다음은 text를 뜻하는 representation이다.

2.2 Self Attention

장기 의존성을 잡기 위해서 bilinear attention을 사용한다. 100개의 utterance가 있어도 self-attention은 장기 context를 잡을 수 있다. Text에 대해서 다음과 같이 계산한다.

2.3 Cross Attention

msa는 서로 다른 modality간에 interaction을 배울 기회를 제공한다. modality를 두 쌍씩 묶어서 co-attention matrix를 배운다.

2.4 Gating Mechanism for Cross Interaction

imperfect modality을 fusing하는 문제가 생기게 된다.

각 modality에서 발생하는 noise를 해결하기 위해서 선택적으로 cross fused vector를 배우기 위해 gating mechanism을 제안한다.

gated cross fused vector는 다음과 같이 얻는다.

여기서 fusion kernel fusion(,)은 gated combination of cross interaction과 contextual representation을 사용한다.

Cross interaction인 X(P,Q)은 P는 cross attended vector, Q는 contextual representation인 비선형변환이다. Gating function인 G(P,Q)은 cross interaction에서 다음 layer로 pass되는 정보를 조절한다.

따라서 최종 계산은 다음과 같다.

modality의 특성이 보완적인 경우, gating function은 cross interaction을 선호하기 때문에 더 높은 값을 가질 것이다. 반면에 그렇지 않은 경우 contextual representation을 선호할 것이고, 낮은 값을 가질 것이다.

2.5 Deep Multimodal Fusion

self 와 gated cross interaction을 합하기 위해 Bi-GRU를 사용해서 합친다.

3. Experiments

3.1 Dataset

CMU-MOSI와 CMU-MOSEI를 사용한다. values가 0 이상이면 긍정으로 반대면 부정으로 했다.

3.2 Implementation Details

word feature에 대해서는 Glove를 사용했고, visual은 Facets, acoustic은 CovaRep을 사용했다.

3.3 Results and Analysis

3.3.1 Baselines and Ablation Study

제안한 방법을 분석하기 위해서 여러 실험을 수행했다.

B1 : unimodal

B2 : B1+Self+Attention

B3 : bimodal baseline

B4 : gating mechanism

B6 : our model

3.3.2 Benchmarking

종합적으로 비교하기 위해서 다른 multimodal sentiment analysis와 비교해보았다.

제일 좋았다.

4. Conclusions and future work

self-attention과 gating mechanism을 사용해서 msa를 발전시켰다.

gating 함수는 unimodal한 정보가 sentiment를 결정하기 충분하지 않을 때 cross-interaction을 강화하고, 충분하다면 cross-modal information에 낮은 가중치를 부여한다.

앞으로는 audio 데이터의 질이 낮은 실제 데이터에도 적용해보는 것이 목적이다.

728x90
반응형
728x90
반응형

문제:

풀이방법:

 연산자를 계산하는 방법으로 주로 스택을 사용하기 때문에 스택을 사용하고, 수식의 갯수가 3개이므로 최대 6가지 조합이 가능하기 때문에 브루트 포스 방법을 사용해서 모든 케이스에 대해 계산을 하고 그 중 최대값을 찾는 방법을 사용한다.

 우선 정규표현식과 itertools의 permutations을 사용해서 입력받은 expression에 대해서 숫자와 수식을 분리해내고, 연산자들의 우선순위를 만든다.

 생성된 우선순위별로 숫자와 연산자들을 스택에 넣고, 연산자가 현재 해당하는 우선순위의 연산자라면 숫자 스택에서 두 개를 빼고, 연산자 스택에서 하나를 빼서 연산을 하고 다시 숫자 스택에 넣도록 한다.

 이 과정을 우선순위와 연산자별로 계속 반복해서 하고 이 중 max 값을 찾아서 반환하도록 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
def calculate(a,b,op):
    if op=="+":
        return a+b
    elif op=="*":
        return a*b
    else:
        return a-b
 
def solution(expression):
    import re
    from itertools import permutations
    prior = list(permutations(["+","*","-"],3))
    digit = re.compile("[0-9]+")
    operator = re.compile("[^0-9]")
    numbers = list(map(int,digit.findall(expression)))
    oper = list(operator.findall(expression))
    
    answer = 0
    for pr in prior:
        number = numbers
        ope = oper
        for i in range(3):
            stack = [number[0]]
            stack_op = []
            count = 1
            while count < len(number):
                stack.append(number[count])
                stack_op.append(ope[count-1])
                count+=1
                if stack_op[-1]==pr[i]:
                    b = stack.pop(-1)
                    a = stack.pop(-1)
                    op = stack_op.pop(-1)
                    
                    stack.append(calculate(a,b,op))
            number = stack
            ope = stack_op
        answer = max(answer,abs(number[0]))   
    return answer
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/67257

 

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

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

programmers.co.kr

 

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[Programmers]2020 카카오 인턴십. 보석 쇼핑  (0) 2020.07.16
[BOJ]2164. 카드2  (0) 2020.07.14
[Programmers]2020 카카오 인턴십. 키패드 누르기  (0) 2020.07.07
[BOJ]1543. 문서 검색  (0) 2020.07.02
[BOJ]5525. IOIOI  (0) 2020.06.30
728x90
반응형

문제:

풀이방법:

규칙 중 4를 구현하는 것이 핵심인 문제다.

 solution함수는 1,4,7 입력이 들어온다면 왼쪽 엄지손가락을 사용하고, 해당 번호로 left를 이동시키고, 3,6,9가 들어온다면 오른쪽 엄지손가락을 사용하고 right를 이동시킨다. 이제 2,5,8,0이 들어오는 경우 leftDistance와 rightDistance를 사용해서 거리를 계산한다. 더 작은 쪽의 엄지손가락으로 이동을 하고, 만약 같다면 hand의 우선순위에 따라 움직이도록 한다.

 leftDistance는 입력을 해야하는 숫자가 2,5,8,0일 때, 왼쪽 엄지손가락과 거리를 계산하는 함수다.

만약 이전 왼쪽 엄지 손가락이 2,5,8이고 입력해야 할 숫자가 0이라면 각 케이스마다 거리를 return 하게 만들고, 나머지는 두 수의 차를 3으로 나눈 몫을 반환하도록 한다. 왼쪽 엄지 손가락이 1,4,7에 있다면 이를 가운데 키패드로 옮겨주고 leftDistance로 재귀적으로 거리를 계산하도록 만든다. 이제 나머지 케이스인 0에 있거나, 초기 상태인 *에 있던 경우에 대해서만 거리를 계산해주면 된다.

 rightDistance로 leftDistance와 비슷하게 계산을 하도록 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
def leftDistance(num,left):
    if left in [2,5,8]:
        if num == 0:
            if left ==2:
                return 3
            elif left == 5:
                return 2
            else:
                return 1
        return abs(left-num)//3
    elif left in [1,4,7]:
        return leftDistance(num,left+1)+1
    else:
        if left == -1:
            if num == 2:
                return 4
            elif num == 5:
                return 3
            elif num == 8:
                return 2
            else:
                return 1
        if num == 0:
            return 0
        elif num == 8:
            return 1
        elif num == 5:
            return 2
        else:
            return 3
        
def rightDistance(num,right):
    if right in [2,5,8]:
        if num == 0:
            if right ==2:
                return 3
            elif right == 5:
                return 2
            else:
                return 1
        return abs(right-num)//3
    elif right in [3,6,9]:
        return rightDistance(num,right-1)+1
    else:
        if right == -1:
            if num == 2:
                return 4
            elif num == 5:
                return 3
            elif num == 8:
                return 2
            else:
                return 1
        if num == 0:
            return 0
        elif num == 8:
            return 1
        elif num == 5:
            return 2
        else:
            return 3
def solution(numbers,hand):
    answer = ""
    left, right = -1-1
    for num in numbers:
        if num in [1,4,7]:
            left = num
            answer += "L"
        elif num in [3,6,9]:
            right = num
            answer += "R"
        else:
            center_l = leftDistance(num,left)
            center_r = rightDistance(num,right)
            distance = center_l-center_r
            if distance > 0:
                right = num
                answer += "R"
            elif distance < 0:
                left = num
                answer += "L"
            else:
                if hand =="right":
                    right = num
                    answer+= "R"
                else:
                    left = num
                    answer += "L"
    return answer
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2164. 카드2  (0) 2020.07.14
[Programmers]2020 카카오 인턴십. 수식 최대화  (0) 2020.07.09
[BOJ]1543. 문서 검색  (0) 2020.07.02
[BOJ]5525. IOIOI  (0) 2020.06.30
[BOJ]11652. 카드  (0) 2020.06.25
728x90
반응형

Abstract

93개의 다른언어를 위한 joint multilingual sentence representations를 배운다.

우리의 시스템은 모든 언어가 공유하는 BRE single BiLSTM encoder를 사용하고, 보조적인 역할을 하는 decoder가 있다. 공개되어 있는 parallel corpora로 학습한다.

이것은 영어로만 되어 있는 데이터를 가지고 resulting embedding의 top의 classifier를 배울 수 있고, 이 것을 수정없이 93개 언어로 전이 가능하다.

우리의 실험은 XNLI, ML-Doc, BUCC로 진행했고, 직접 만든 112개의 언어로 유사도를 측정했다.


1. Introduction

deep learning이 NLP에 놀라운 인상을 주었지만 여전히 데이터가 부족하고 제한된 실용성을 가지고 있다.

이러한 이슈를 해결하기 위한 첫 번째 방법은 unlabeled data에 대해 언어 표현을 배우는 것이었고, 이를 task-specific downstream에 적용하는 것이였다. 이 방법은 word embedding으로 유명하지만 최근에는 sentence-level의 표현을 원한다.

그럼에도 불구하고 각 모델들은 서로 다른 언어로 학습되어지기 때문에 서로 다른 언어에는 적용할 수 없어서 적은 자원의 언어로 충분한 성능을 내기에는 한계가 있었다.

그래서 이번에는 input과 NLP task에서 general 할 sentence의 vector representation인 전체 언어를 아우르는 sentence embedding을 다루려고 한다.

이러한 표현형에 동기는 여러 가지가 있다.

  1. 제한된 자원을 가진 언어로 많은 언어를 처리할 수 있다는 희망
  2. 한 언어에서 다른 언어로 zero-shot 하려는 욕망
  3. code-switching을 할 수 있다는 가능성

이전에 있던 multilingual NLP 연구에서는 제한된 몇개 언어에 대해서만 수행을 하거나, 특정 task에 대해서만 수행했다. 이번 논문에서는 93개 언어에 대해서 시도를 했으며, 이는 아마도 우리가 처음일 것 이다.

2. Related Work


생략

3. Proposed method

single BiLSTM을 보조적인 역할을 하는 decoder와 함께 사용한다.

3.1 Architecture

Schwenk가 제안한 구조를 바탕으로 구성되었다.

보이는 것과 같이 sentence embedding은 encoder의 output에 max-pooling을 통해서 얻는다.

이러한 sentence embedding은 선형변환을 통해 decoder LSTM을 초기화하는데에 사용하고, 매 step마다 그 input embedding과 결합된다. sentence embedding에 의해 발견되는 input sequence과 관련된 모든 정보를 원하기 때문에 encoder와 decoder 사이에는 다른 연결은 없다.

우리는 포함된 모든 언어가 공유하는 single encoder와 decoder를 사용한다. 이를 위해서 우리는 50k의 연산을 가지고 있고 모든 훈련 corpora의 결합을 배우기 위해 joint byte-pair encoding (BPE)를 만든다.

encoder는 input language가 무엇인지 signal을 가지고 있지 않고, 이것은 독립적인 representation을 배우도록 할 수 있다. 대조적으로 decoder는 생성해야할 언어를 특정하는 ID embedding을 가지며 이는 input과 sentence embedding이 매 step 합쳐진 것이다.

거의 100개 언어를 위해 충분한 공간이 있어야 한다. 이 논문에서 BiLSTM은 512 차원을 가지는 5개의 layer를 가진다. resulting sentence representation은 1024차원이다. (양방향으로 결합되었기 때문?)

decoder는 항상 2048차원을 가진다.

input embedding 크기는 320으로 고정되어 있고, language ID embedding은 32차원을 가진다.

3.2 Training strategy

이전 연구에서 각 input sentence는 모든 다른 언어로 번역되었다. 하지만 이 접근은 언어의 수가 많아질수록 큰 두가지 단점을 가지고 있다. 첫번째는 이 방법은 N개의 평행한 corpus를 가지고 있어야 하는데 모든 언어를 얻기 힘들다. 두번째는 지수승으로 시간이 증가하기 때문이다.

우리의 사전 실험에서 우리는 두 개의 target 언어만을 사용해서 얻는 비슷한 결과를 관찰했다.

그와 동시에 각 언어 조합을 분리 alignment를 고려함으로써 N개의 parallel corpora에 대한 요구를 완화했다.

훈련 파라미터 설명

3.3 Training data and pre-processing

3.2에서 설명했던 것처럼 훈련 과정에서 두 target 언어가 놓여진 bitext를 요구한다. 따라서 이 논문에서는 영어와 스페인어를 골랐다. 대부분의 데이터가 이러한 언어와 정렬되어 있다.

93개의 언어를 다 수집했다. 기계번역 tool을 사용해서 pre-processing을 했다.

4. Experimental evaluation

multilingual sentence embedding을 평가하는 표준 방법이 존재하지는 않다. 그래서 가장 괜찮다고 생각되는 XNLI(4.1)과 cross-lingual document classification(4.2), Bitext mining(4.3)그리고 저자가 직접 만든 평가방법(4.4)로 이 모델을 평가하고자 한다.

4.1 XNLI : cross-lingual NLI

NLI는 sentence representation를 평가하는데 가장 많이 사용되는 방법이다. 두 문장이 주어지고 이 두 문장간의 관계를 파악하는 문제다. XNLI는 영어를 다른 언어로 번역을 한 뒤에 NLI 과정을 거치는 평가방법이다. 이를 BERT와 비교해보았을 때, 영어 단일 NLI에 대해서는 성능이 좋지 못했지만 이를 다른 언어로 번역한 뒤에 성능을 평가했을 때에는 더 좋은 성능을 얻었다.

4.2 MLDoc : cross-lingual classification

4.3 BUCC : bitext mining

4.4 Tatoeba: similarity search

5. Ablation experiments

5.1 Encoder depth

encoder의 깊이가 길어질수록 성능이 더 좋아진다.

5.2 Multitask learning

생략

5.3 Number of training languages

얼마나 많은 언어를 수용할 수 있는지 알 수 있기 위해 93개 언어를 가지고 있는 모델과 18개 언어를 가지고 있는 부분 모델과 비교해보았을 때, 큰 차이가 없다.

6. Conclusions

  • 이 논문에서 93개 언어에 대해 multilingual fixed-length sentence embeddings을 배우는 구조를 제안했다.
  • multilingual sentence embedding을 평가하는 방법들에 대해서 좋은 성능을 보였고, 이 논문에서 만든 평가방법에서도 좋은 성능을 보였다.
  • 다음 연구에서는 self-attention을 encoder 구조를 사용하는 것을 생각해보겠다.
  • 혹은 monolingual data를 사용하거나 unsupervised MT와 같은 방법을 사용하는 전략도 찾아보겠다.

사견

  • 약 93개의 언어를 하나의 embedding으로 만드는 것은 좋다.
  • 하지만 16개의 GPU를 사용했다고 하는데, 이건 facebook이라서 할 수 있는 방법이지 않을까 생각이 든다.
    • 성능으로 찍어 누른 느낌
728x90
반응형
728x90
반응형

문제:

세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준이의 함수는 중복되어 세는 것은 빼고 세야 한다. 예를 들어, 문서가 abababa이고, 그리고 찾으려는 ababa라면, 세준이의 이 함수는 이 단어를 0번부터 찾을 수 있고, 2번부터도 찾을 수 있다. 그러나 동시에 설 수는 없다.

 

세준이는 문서와 검색하려는 단어가 주어졌을 때, 그 단어가 최대 몇 번 중복되지 않게 등장하는지 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 문서가 주어진다. 문서의 길이는 최대 2500이다. 둘째 줄에 검색하고 싶은 단어가 주어진다. 이 길이는 최대 50이다. 문서와 단어는 알파벳 소문자와 공백으로 이루어져 있다.

출력:

첫째 줄에 중복되지 않게 최대 몇 번 등장하는지 출력한다.

풀이방법:

브루트 포스 방법으로 문서에서 함수를 찾는 방법을 사용했다. 이 때 함수를 찾았다면 함수의 길이만큼 인덱스를 이동시키고, 그렇지 않으면 1을 증가시켰다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
A=input()
B=input()
 
answer = 0
idx = 0
while idx <len(A):
    correct=True
    if A[idx]==B[0]:
        for j in range(1,len(B)):
            if idx+< len(A):
                if B[j]!=A[idx+j]:
                    correct=False
                    break
            else:
                correct = False
                break
    else:
        correct= False
    if correct:
        answer+=1
        idx+=len(B)
    else:
        idx+=1
            
print(answer)
cs

문제링크:

https://www.acmicpc.net/problem/1543

 

1543번: 문서 검색

세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준이의 함수는 중복되어 세는 것은 빼고 세야 한�

www.acmicpc.net

 

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[Programmers]2020 카카오 인턴십. 수식 최대화  (0) 2020.07.09
[Programmers]2020 카카오 인턴십. 키패드 누르기  (0) 2020.07.07
[BOJ]5525. IOIOI  (0) 2020.06.30
[BOJ]11652. 카드  (0) 2020.06.25
[BOJ]5052. 전화번호 목록  (0) 2020.06.23
728x90
반응형

문제:

N+1개의 I와 N개의 O로 이루어져 있으면, I와 O이 교대로 나오는 문자열을 Pn 이라고 한다.

 

P1 IOI

P2 IOIOI

P3 IOIOIOI

Pn IOIOI...OI (O가 N개)

 

I과 O로만 이루어진 문자열 S와 정수 N이 주어졌을 때, S안에 Pn이 몇 군데 포함되어 있는지 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 N이 주어진다. 둘째 줄에는 S의 길이 M이 주어지며, 셋째 줄에 S가 주어진다. (1<=N<=1,000,000 , 2N+1 <= M <= 1,000,000)

출력:

S에 Pn이 몇 군데 포함되어 있는지 출력한다.

풀이방법:

Pn은 I와 O가 교대로 나오는 문자열이다. 따라서 index로 비교해서 IOI 패턴을 만족하는지 확인하고 이렇게 연속된 횟수를 세고 N과 일치할 경우 answer를 1 증가시킨다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
= int(input())
= int(input())
= input()
 
answer = 0
pattern = 0
= 1
while i < M-1:    
    if S[i-1]=='I' and S[i]=='O' and S[i+1]=='I':
        pattern +=1
        if pattern == N:
            pattern -=1
            answer +=1
        i+=1
    else:
        pattern = 0
    i+=1
print(answer)
cs

문제링크:

https://www.acmicpc.net/problem/5525

 

5525번: IOIOI

문제 N+1개의 I와 N개의 O로 이루어져 있으면, I와 O이 교대로 나오는 문자열을 PN이라고 한다. P1 IOI P2 IOIOI P3 IOIOIOI PN IOIOI...OI (O가 N개) I와 O로만 이루어진 문자열 S와 정수 N이 주어졌을 때, S안에 PN

www.acmicpc.net

 

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[Programmers]2020 카카오 인턴십. 키패드 누르기  (0) 2020.07.07
[BOJ]1543. 문서 검색  (0) 2020.07.02
[BOJ]11652. 카드  (0) 2020.06.25
[BOJ]5052. 전화번호 목록  (0) 2020.06.23
[BOJ]12865. 평범한 배낭  (0) 2020.06.18
728x90
반응형

Abstract

주어진 text description에서 이미지를 생성하는 것은 두 가지 목표를 가지고 있다.

  1. visual realism

    얼마나 이미지를 정교하게 만들었는가

  2. semantic consistency

    이미지가 주어진 text description을 잘 반영했는가.

GAN을 사용해서 이 문제를 해결하고자 하는 노력이 많이 있었다. 하지만 좋은 성능을 보이지 못했고, 이 논문에서 novel global-local attentive와 semantic-preserving text-to-image-to-text framework인 MirrorGAN을 제안한다.

MirrorGAN은 semantic text embedding module(STEM), global-local collaborative attentive module for cascaded image generation(GLAM), semantic text regeneration and alignment module (STREAM) 이라는 세 모듈로 구성되어 있다.

STEM은 word, sentence-level embedding을 만들고, GLAM은 target image를 다양하고 의미론적으로 유의미하게 만들기 위해 local word attention과 global sentence attention을 사용한다.

STREAM은 생성된 이미지로부터 다시 text description을 생성함으로써 의미론적으로 잘 맞는지 확인한다.

1. Introduction

기존의 T2I 모델들은 text와 상관없는 이미지를 만드는 경우가 많았기 때문에 NLP, vision 모두에서 연구 대상이었다. GAN으로 image를 생성하는 것이 좋은 성능을 보였으나 여전히 text를 input으로 넣었을 때에는 좋지 못했다.

이에 대해서 수많은 연구들이 진행되었지만, text와 image 사이의 gap으로 인해서 어려움을 겪었다. 최근에는 attention mechanism이 이러한 문제를 해결하는 것처럼 보였지만 word-level attention을 홀로 사용하는 것은 text와 image modalities 사이의 다양성으로 인해 global semantic consistency를 보장하지 못했다.

T2I는 image captioning의 반대 문제이다. 따라서 이를 활용하기 때문에 MirroGAN이라고 부르게 된다.(뒤의 모델을 보면 이해가 될 것이다.) 앞서 말한 것과 같이 MirroGAN은 STEM, GLAM, STREAM을 가지고 있다.

모델을 end-to-end로 학습하기 위해서 visual realism adversarial loss 와 text-image paired semantic consistency adversarial loss를 가지고 있다.

내용을 요약하면 다음과 같다.

  • T2I와 I2T를 동시에 활용하기 때문에 MirrorGAN이라고 부른다.
  • preserve cross-domain semantic consistency와 smoothen the generative process를 위해서 global-local collaborative attention 모델을 제안한다.
  • GAN에서 사용하던 loss를 사용하지 않고 다른 loss를 사용한다.

2. Related work

생략

3. MirrorGAN for text-to-image generation

Figure 2는 MirrorGAN의 전반적인 구조다.

3.1 STEM : Semantic Text Embedding Medule

text description을 local word-level feature과 global sentence-level feature으로 만든다. text desciption T로 부터 semantic embedding를 추출하기 위해서 RNN을 사용한다. Text의 다양성 때문에 few permutation을 가진 text는 비슷한 의미를 공유한다. 따라서 conditioning augmentation 방법을 사용한다. robustness를 부여 할 수 있다.

3.2 GLAM: Global-Local collaborative Attentive Module in Cascaded Image Generators

세 개의 image generation network를 연속적으로 쌓음으로써 multi-stage cascaded generator를 구축한다. 이는 좋은 성능을 낸다.

word-level attention model으로 word-context feature를 생성한다. 이 것은 word embedding w와 visual feature f 를 input으로 넣어준다. word embedding w는 visual feature의 semantic space로 변환한다. 그리고 이 것은 이전 visual feature와 곱해진다. 최종적으로 내적 연산을 통해서 word-context feature를 얻는다.

sentence-level attention model로 global constraint를 강화한다. augmented sentece vector는 visual feature의 semantic space로 변환한다. 그 다음에 element-wise 곱을 한다.

3.3 STREAM: Semantic Text REgeneration and Alignment Module

위에서 설명한 것과 같이, MirrorGAN은 주어진 text 설명과 의미론적으로 일치하게 만들기 위해서 생성된 image에서 text 설명을 다시 생성하는 STREAM 단계를 가지고 있다. 널리 사용하는 image caption framework 기반의 encoder-decoder를 사용한다. 더 나은 image captioning model을 사용하면 더 좋은 결과를 얻을 수 있을 것이다. 그러나 이번 연구에서는 제안한 아이디어를 확인하기 위해서 간단한 구조를 사용했다.

encoder는 ImageNet으로 pretrain된 CNN을 사용하고 decoder는 RNN을 사용한다. 최종 단계에서 생성된 image를 CNN encoder와 RNN decoder에 넣어준다.

pre-trained STREAM은 MirrorGAN이 더 안정적인 훈련 과정과 수렴속도를 빠르게 만든다.

3.4 Objective functions

MirrorGAN의 훈련과정에서 G와 D가 서로 훈련이 된다.

G는 위 loss를 최소화함으로써 훈련이 된다. Ii는 생성된 의미지를 의미한다. 첫 번째 term은 visual realism adversarial loss이고 image가 visual 쪽으로 real인지 fake인지를 판단한다. 두 번째 term은 text와 image가 의미론적으로 일치하는 가를 나타낸다.

여기에 STREAM loss를 추가한다.

최종 G Loss는 다음과 같이 사용한다.

Discriminator loss는 위와 같이 사용한다.

4. Experiments

728x90
반응형
728x90
반응형

문제:

준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -2^62보다 크거나 같고, 2^62보다 작거나 같다.

 

준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지고 있는 정수를 구하는 프로그램을 작성하시오. 만약, 가장 많이 가지고 있는 정수가 여러 가지라면, 작은 것을 출력한다.

입력:

첫째 줄에 준규가 가지고 있는 숫자 카드의 개수 N (1<=N<=100,000)이 주어진다. 둘째 줄부터 N개 줄에는 숫자 카드에 적혀있는 정수가 주어진다.

출력:

첫째 줄에 준규가 가장 많이 가지고 있는 정수를 출력한다.

풀이방법:

 숫자를 입력받으면서 HashTabel을 만들고, 이를 item 리스트로 만들면서 조건에 맞게 정렬을 하면 된다.

1
2
3
4
5
6
7
8
9
10
= int(input())
hashTable={}
for _ in range(N):
    h = int(input())
    if h in hashTable:
        hashTable[h] += 1
    else:
        hashTable[h] = 1
hashList = sorted(list(hashTable.items()),key=lambda x : (-x[1],x[0]))
print(hashList[0][0])
cs

문제링크:

https://www.acmicpc.net/problem/11652

 

11652번: 카드

준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -262보다 크거나 같고, 262보다 작거나 같다. 준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지

www.acmicpc.net

 

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]1543. 문서 검색  (0) 2020.07.02
[BOJ]5525. IOIOI  (0) 2020.06.30
[BOJ]5052. 전화번호 목록  (0) 2020.06.23
[BOJ]12865. 평범한 배낭  (0) 2020.06.18
[BOJ]10830. 행렬 제곱  (0) 2020.06.16

+ Recent posts