본문 바로가기
공부

BOJ 14425 해결 그리고 시간초과

by 뜨응 2022. 1. 16.
오늘은 map이라는 라이브러리를 공부해보았다. map<type ,type>변수이름 이런 형태이다. 
map은 key와 value가 짝을 지어 저장된다. map은 트리(균형을 이룸) 구조 형태이기 때문에 데이터를 찾고 삽입하고 삭제하는 시간 복잡도는 O(log n)시간이 든다. 또한 map은 key값이 들어갈 때 정렬되어서 들어가기 때문에 따로 정렬할 필요가 없다.

오늘도 틀린 코드 두 개와 맞은 코드를 한 개 들고 왔다. 틀린 코드는 하나는 map을 이용해서 다른 하나는 배열을 이용했는데 둘 다 시간초과가 났다..

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

틀린 코드 1

#include<iostream>

using namespace std;

int k , n , l ;
string a[10001];
string b;
int main() {

   cin.sync_with_stdio(0);
   cin.tie(0);

   cin >> n>>k ;

   for (int i = 0; i < n; i++) {
      cin >> a[i];
   }
   for (int j = 0; j < k; j++) {
      cin >> b;
      for (int m = 0; m < n; m++) {
         if (a[m] == b) {
            l++;
         }
         else continue;
      }
   }
   cout << l;
}
  • 이 코드에서 시간 초과가 난 이유 

2중 for문 안에서 k와 n의 최대 값이 각 각 10000이다. 따라서 1억번 연산하게된다. b의 최대의 길이는 499인데 문자열비교를 해버리면 499억의 시간이 걸리게된다. 문제의 제한 시간읜 2초 즉 2억번 연산하는 것인데 그를 훨씬 넘어 시간 초과가 뜨게된 것이다.

밑의 경우도 같은 이유같다.

틀린 코드 2

#include<iostream>
#include<map>

using namespace std;

int k , n , l ;
string a ,b ;
int main() {

   cin.sync_with_stdio(0);
   cin.tie(0);

   cin >> n>>k ;
   map<int, string>ma;
   for (int i = 0; i < n; i++) {
      cin >> a;
      ma.insert(make_pair(i , a));
   }
   for (int j = 0; j < k; j++) {
      cin >> b;
      for (auto it = ma.begin(); it != ma.end(); it++) {
         if (it->second == b) {
            l++;
         }
         else continue;
      }
   }
   cout << l;
}

맞은 코드

#include<iostream>

#include<map>

using namespace std;

int k , n , l ;

string b;
map<string, int>ma;
int main() {

	cin.sync_with_stdio(0);
	cin.tie(0);

	cin >> n>>k ;
	for (int i = 0; i < n; i++) {
		cin >> b;
		ma.insert(make_pair(b ,i));
	}
	for (int j = 0; j < k; j++) {
		cin >> b;
		if (ma.count(b)) l++;
		else continue;
	}
	cout << l;
}
  • 코드를 좀 더 간단하게 만들 수 있다. 
  • ma.insert({b,i}) 로 바꿀 수 있다. 그리고 insert 를 쓰지 않고 ma[b] ++; 이렇게 하면 ma.count(b)를 쓰지 않고 이 문제를 풀 수 있다.
  • ma[b]++ 는 b라는 key값에 value에 1이 들어간 것이다. 
  • 위와 같이 쓰게 되면 ma.count(b) 를 if(ma[b] == 1) l++; 로 고칠 수 있다.

 

오늘도 그렇게 어렵지는 않았는데 시간 초과문제가 정말 거슬렸다. 시간 복잡도가 정말 중요한 것 같다. 
오늘 처음으로 JAVA공부해봤는데 main을 선언하는 것부터가 너무 별로다.. 최악..
화이팅

'공부' 카테고리의 다른 글

BOJ 2455 지능적이게 풀지 못 한 문제..  (7) 2022.03.04
나의 휴학 계획을 세우다.  (5) 2022.03.02
BOJ 10773 해결과 개선  (0) 2022.01.13
BOJ 11004 해결, 시간 초과  (0) 2022.01.13
BOJ 9012 해결과 고찰.....(최악)  (0) 2022.01.12