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
import tensorflow as tf
import pandas as pd
import numpy as np
 
from gensim.models.wrappers import FastText
model_ft = FastText.load_fasttext_format("model_drama.bin")
print("fasttext model load finished")
 
def featurize_rnn(corpus,wdim,maxlen):
    rnn_total = np.zeros((len(corpus),maxlen,wdim))
    for i in range(len(corpus)):
        if i%1000 ==0:
            print(i)
        s = corpus[i]
        for j in range(len(s)):
            if s[-j-1in model_ft and j < maxlen:
                rnn_total[i][-j-1,:] = model_ft[s[-j-1]]
    return rnn_total
 
inp = pd.read_csv("train.csv")
total_data = inp[:]["text"].values.tolist()
total_label = np.array(inp[:]["smishing"].values.tolist())
rnn_total_text = featurize_rnn(total_data,100,100)
 
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Bidirectional, LSTM, Dense
def biLSTM(result):
    model = Sequential()
    model.add(Bidirectional(LSTM(64), input_shape=(len(result[0]), len(result[0][0]))))
    model.add(Dense(128, activation='relu'))
    model.add(Dense(32, activation='relu'))
    model.add(Dense(1, activation="softmax"))
    model.summary()
    model.compile(loss="sparse_categorical_crossentropy",
                  optimizer=tf.keras.optimizers.Adam(1e-4),
                  metrics=['accuracy'])
    history = model.fit(result,
                        total_label,
                        epochs=10,
                        validation_split=0.1,
                        batch_size=512)
biLSTM(rnn_total_text)
cs

한국어 임베딩 부분인 feature_rnn함수는 https://github.com/warnikchow/dlk2nlp를 참고했습니다.

간단한 2진분류를 목적으로 했기 때문에 마지막 Dense는 1로 뒀습니다.

다양하게 분류하고 싶으시면 마지막 Dense를 늘려서 사용하시면 될 거 같아요

모델을 저장하는 부분은 차후에 업데이트 하도록 하겠습니다.

감정분류 모델을 만들어봤습니다.

2진 분류가 아닌 특정감정으로 분류하는 모델을 만들었는데

많은 곳에서 인용한 거라

데이터를 모으는 과정 외에는 사실상 짜집기 입니다.

하지만 이런 자료도 필요하신 분이 계시겠죠!

https://github.com/emotion-classifier/emotion_classifier

 

emotion-classifier/emotion_classifier

Use bert model for claffify the emotion of sentence - emotion-classifier/emotion_classifier

github.com

github주소 입니다.

Naive bayes

SVM

biLSTM

bert

네가지 모델을 돌려보았고

SVM과 bert가 80%대의 정확도를 보였습니다.

자세한 내용은 accuracy report폴더의 엑셀파일을 참고해주세요

데이터가 필요하신 분도 계실 거 같아 데이터도 github에 올려두었습니다!

문제 입력값의 크기가 큰 것을 보고 눈치채야 했었다.

처음 짠 코드는 다음과 같다.

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

vector<int> deciTobi(long long num) {
	vector<int> reverse_result;
	vector<int> result;
	while (num > 0) {
		reverse_result.push_back(num % 2);
		num /= 2;
	}
	for (long long i = reverse_result.size()-1; i >= 0 ; i--) {
		result.push_back(reverse_result[i]);
	}
	return result;
}

int main() {
	long long k, sumresult = 0;
	cin >> k;
	long long end = pow(2, k);
	for (int i = 1; i < end; i++) {
		sumresult += i;
	}
	vector<int> result = deciTobi(sumresult);

	for (int i = 0; i < result.size(); i++) {
		cout << result[i];
	}
}

자신있게 풀었고 제출했더니 틀렸단다.

왜지? 하고 계속 쳐다봤는데 숫자 100을 입력하니 메모리 초과가 뜬다.

그때 깨달았다.

이건 10진수를 2진수로 바꾸는 문제가 아닌 것이라는 걸....

기왕 만든 코드로 1부터 10까지 돌려봤다.

규칙성이 나왔다.

k = 1 -> 1

k= 2 -> 110

k=3 -> 11100

k=4 -> 1111000

k=5 -> 111110000

규칙성이 보이는가?

 

답은 아래와 같다.

#include <iostream>

using namespace std;


int main() {
	int k;
	cin >> k;
	for (int i = 0; i < k; i++) {
		cout << 1;
	}
	for (int i = 0; i < k - 1; i++) {
		cout << 0;
	}
	cin >> k;
	return 0;
}

규칙성 찾기 문제였다.

다음에는 꼭 손으로 풀어보고 코딩해야겠다...

#include <iostream>
#include <math.h>

using namespace std;

bool is_num(char a) {
	if (a == '0' || a == '1' || a == '2' || a == '3' || a == '4' || a == '5' || a == '6' || a == '7' || a == '8' || a == '9')
		return true;
	else
		return false;
}

int main() {
	long long  temp = 0, result = 0;
	int length, jump = 1;
	cin >> length;
	char* word = new char[length+1];
	cin >> word;
	
	for (int i = length; i >= 0; i--) {
		if (is_num(word[i])) {
			temp += (word[i] - '0') * jump;
			jump *= 10;
		}
		if (i == 0 || !is_num(word[i])) {
			result += temp;
			temp = 0;
			jump = 1;
		}
	}
	cout << result;

	return 0;
}

에라토스테네스의 채를 이해하면 금방 풀 수 있다.

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;
bool cache[123456 * 2 + 1];
int main() {
	vector<int> inputs;
	int a;
	while (true) { //input
		cin >> a;
		if (a == 0 || a > 123456) break;
		inputs.push_back(a);
	}

	for (int i = 2; i < 123456 * 2; i++)
		cache[i] = true;
	for (int i = 2; i < sqrt(123456 * 2); i++) {
		if (cache[i]) {
			for (int j = i + i; j <= 123456 * 2; j += i) {
				cache[j] = false;
			}
		}
	}

	for (int i = 0; i < inputs.size(); i++) {
		int count = 0;
		for (int j = inputs[i]+1; j <= inputs[i]*2; j++) {
			if (cache[j]) {
				count++;
			}
		}
		cout << count << endl;
	}
}

'컴퓨터 > 문제 풀기' 카테고리의 다른 글

백준 8741번 이진수 합  (0) 2019.07.29
백준 8595번 히든넘버  (0) 2019.05.27
백준 1946번 신입 사원  (0) 2019.05.20
백준 16955번 오목, 이길 수 있을까?  (0) 2019.05.20
10799번 쇠막대기  (0) 2019.05.13

입력 한개는 index

다른 입력으로 작은 걸 찾는 그리디 문제

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int testcase;
	cin >> testcase;
	if (testcase < 1 || testcase>20) {
		exit(0);
	}
	int *result = new int[testcase+1];

	for (int i = 0; i < testcase; i++) {
		int pnum;
		cin >> pnum;
		if (pnum < 1 || pnum>100000) {
			exit(0);
		}
		int *people = new int[pnum+1];
		for (int j = 0; j < pnum; j++) {
			int a, b;
			cin >> a >> b;
			if (a<1 || a > 100000 || b<1 || b > 100000) {
				exit(0);
			}
			people[a] = b;
		}

		int counter = 0;
		int selector = 0;
		for (int j = 1; j <= pnum; j++) {
			if (j == 1) {
				counter++;
				selector = people[j];
				continue;
			}
			if (people[j] < selector) {
				counter++;
				selector = people[j];
			}
		}
		result[i] = counter;
	}
	for (int i = 0; i < testcase; i++) {
		cout << result[i] << endl;
	}
}

'컴퓨터 > 문제 풀기' 카테고리의 다른 글

백준 8595번 히든넘버  (0) 2019.05.27
백준 4948번 베르트랑 공준  (0) 2019.05.20
백준 16955번 오목, 이길 수 있을까?  (0) 2019.05.20
10799번 쇠막대기  (0) 2019.05.13
2413번 비슷한 순열  (1) 2019.05.13

9방향을 다 체크해본다.

무식한 방법이다.

#include <iostream>

using namespace std;

int map[10][10];

bool letmego(int go, int x, int y, int depth, int counter,int blank) {
	if (depth > 4) {
		return false;
	}
	if (depth == 4) {
		if ((counter == 4 && blank == 1) || counter==5) {
			return true;
		}
	}
	if (go == 0 && x > 0 && y > 0) {
		if (map[x - 1][y - 1] == 1) {
			return letmego(go, x - 1, y - 1, depth + 1, counter + 1, blank);
		}
		else if (map[x - 1][y - 1] == 2) return false;
		else {
			return letmego(go, x - 1, y - 1, depth + 1, counter, blank+1);
		}
	}
	else if (go == 1 && y > 0) {
		if (map[x][y - 1] == 1) {
			return letmego(go, x, y - 1, depth + 1, counter + 1, blank);
		}
		else if (map[x][y - 1] == 2) return false;
		else {
			return letmego(go, x, y - 1, depth + 1, counter, blank+1);
		}
	}
	else if (go == 2 && x < 9 && y > 0) {
		if (map[x + 1][y - 1] == 1) {
			return letmego(go, x + 1, y - 1, depth + 1, counter + 1, blank);
		}
		else if (map[x + 1][y - 1] == 2) return false;
		else {
			return letmego(go, x + 1, y - 1, depth + 1, counter, blank+1);
		}
	}
	else if (go == 3 && x > 0) {
		if (map[x - 1][y] == 1) {
			return letmego(go, x - 1, y, depth + 1, counter + 1, blank);
		}
		else if (map[x - 1][y] == 2) return false;
		else {
			return letmego(go, x - 1, y, depth + 1, counter, blank+1);
		}
	}
	else if (go == 4 && x < 9) {
		if (map[x + 1][y] == 1) {
			return letmego(go, x + 1, y, depth + 1, counter + 1, blank);
		}
		else if (map[x + 1][y] == 2) return false;
		else {
			return letmego(go, x + 1, y, depth + 1, counter, blank+1);
		}
	}
	else if (go == 5 && x > 0 && y < 9) {
		if (map[x - 1][y + 1] == 1) {
			return letmego(go, x - 1, y + 1, depth + 1, counter + 1, blank);
		}
		else if (map[x - 1][y + 1] == 2) return false;
		else {
			return letmego(go, x - 1, y + 1, depth + 1, counter, blank+1);
		}
	}
	else if (go == 6 && y < 9) {
		if (map[x][y + 1] == 1) {
			return letmego(go, x, y + 1, depth + 1, counter + 1, blank);
		}
		else if (map[x][y + 1] == 2) return false;
		else {
			return letmego(go, x, y + 1, depth + 1, counter, blank+1);
		}
	}
	else if (go == 7 && x < 9 && y < 9) {
		if (map[x + 1][y + 1] == 1) {
			return letmego(go, x + 1, y + 1, depth + 1, counter + 1, blank);
		}
		else if (map[x + 1][y + 1] == 2) return false;
		else {
			return letmego(go, x + 1, y + 1, depth + 1, counter, blank+1);
		}
	}
	return false;
}

int main() {
	int a = 0, b = 0;
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			char temp;
			cin >> temp;
			if (temp == 'X') {
				map[i][j] = 1;
				a++;
			}
			else if (temp == 'O') {
				map[i][j] = 2;
				b++;
			}
			else if (temp == '.') map[i][j] = 0;
		}
	}
	if (a != b) {
		exit(0);
	}
	bool flag = false;
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			if(map[i][j] == 1){
				for (int k = 0; k < 8; k++) {
					if (letmego(k, i, j, 0, 1, 0))	flag = true;
				}
			}
		}
	}
	if (flag) {
		cout << 1<<endl;
	}
	else {
		cout << 0 << endl;
	}
}

'컴퓨터 > 문제 풀기' 카테고리의 다른 글

백준 4948번 베르트랑 공준  (0) 2019.05.20
백준 1946번 신입 사원  (0) 2019.05.20
10799번 쇠막대기  (0) 2019.05.13
2413번 비슷한 순열  (1) 2019.05.13
2309번 일곱 난쟁이  (0) 2019.05.13
#include <iostream>
#include <vector>
#include <utility>
#include <string>
#include <string.h>

using namespace std;

int main(){
	string s;
    cin >> s;

    char before = s[0];
    vector< pair<int,bool> > steel_num(1,make_pair(1, true));
	for(int i = 1; i< s.length(); i++){
        if(s[i] == '('){
            steel_num.push_back(make_pair(1,true));
        }
        else if(s[i] == ')'){
            if(before == '('){  //레이저일때
                steel_num.pop_back();
                for(int j = 0; j<steel_num.size(); j++){
                    if(steel_num[j].second == true)
                        steel_num[j].first++;
                }
            }
            else{
                for(int j = steel_num.size()-1; j >= 0; j--){
                    if(steel_num[j].second == true){
                        steel_num[j].second = false;
                        break;
                    }
                }
            }
        }
        before = s[i];
	}
	int result = 0;
    for(int i = 0; i<steel_num.size(); i++){
        //cout<<steel_num[i].first<<" ";
        result += steel_num[i].first;
    }
    cout<<result<<endl;

    return 0;
}

'컴퓨터 > 문제 풀기' 카테고리의 다른 글

백준 1946번 신입 사원  (0) 2019.05.20
백준 16955번 오목, 이길 수 있을까?  (0) 2019.05.20
2413번 비슷한 순열  (1) 2019.05.13
2309번 일곱 난쟁이  (0) 2019.05.13
백준 1780번 종이의 개수  (0) 2019.05.13
#include <iostream>

using namespace std;

void swap(int *arr, bool *table, int a, int b) {
	int temp = arr[b];
	arr[b] = arr[a];
	arr[a] = temp;
	table[a] = table[b] = true;
}

int main() {
	int len;
	cin >> len;
	if (len < 3 && len > 50000) {
		return 0;
	}
	int *arr = new int[len];
	bool *table = new bool[len];
	for (int i = 0; i < len; i++) {
		cin >> arr[i];
		table[i] = false;
	}

	for (int i = 0; i < len-1; i++) {
		int temp = arr[i];
		for (int j = i+1; j < len; j++) {
			if (arr[j] == temp - 1 && table[i] == false && table[j] == false) {
				swap(arr, table, i, j);
			}
		}
	}

	for (int i = 0; i < len; i++) {
		cout << arr[i]<< " ";
	}

	cin >> arr[1];
	return 0;
}

'컴퓨터 > 문제 풀기' 카테고리의 다른 글

백준 16955번 오목, 이길 수 있을까?  (0) 2019.05.20
10799번 쇠막대기  (0) 2019.05.13
2309번 일곱 난쟁이  (0) 2019.05.13
백준 1780번 종이의 개수  (0) 2019.05.13
백준 2688번 줄어들지 않아  (0) 2019.05.13
#include <iostream>

using namespace std;

int arr[9];
int result[7];
int result2[7];

void bubblesort(int *arr, int len) {
	for (int i = 0; i < len-1; i++) {
		for (int j = 0; j < len-i-1; j++) {
			if (arr[j] > arr[j + 1]) {
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

void is100(int index, int select, int sum) {
	if (sum == 100 && index == 7) {
		for (int i = 0; i < 7; i++) {
			result2[i] = result[i];
		}
		return;
	}
	if (index >= 7) {
		return;
	}
	for (int i = select; i < 9; i++) {
		result[index] = arr[i];
		is100(index+1, i+1, sum + arr[i]);
		result[index] = 0;
	}
}

int main() {
	for (int i = 0; i < 9; i++) {
		cin >> arr[i];
	}
	
	is100(0, 0, 0);
	bubblesort(result2, 7);

	for (int i = 0; i < 7; i++) {
		cout << result2[i] << endl;
	}

	return 0;
}

'컴퓨터 > 문제 풀기' 카테고리의 다른 글

백준 16955번 오목, 이길 수 있을까?  (0) 2019.05.20
10799번 쇠막대기  (0) 2019.05.13
2413번 비슷한 순열  (1) 2019.05.13
백준 1780번 종이의 개수  (0) 2019.05.13
백준 2688번 줄어들지 않아  (0) 2019.05.13

+ Recent posts