팰린드롬 문자인지, 문자열을 뒤집은 문자를 포함하는지를 확인해야 한다. 
“문자열을 뒤집은 문자를 포함하는지” 확인하면, 자기 자신이 팰린드롬일 때 이 조건을 이미 만족한다. 
 
#include <bits/stdc++.h>
using namespace std;

int n;
string st, answer;

int mmmmmain(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> n;

  vector<string> v(n);
  for(int i = 0; i < n; i++){
    cin >> v[i];
  }
  for(int i = 0; i < n; i++){
    st = v[i];
    reverse(st.begin(), st.end());
    if( st == *find(v.begin(), v.end(), st)) {
      answer = st; break;
    }
  }
  int asize = answer.size();
  cout << asize << ' ' << answer[asize/2];
  return 0;
}
728x90

'알고리즘 > 백준' 카테고리의 다른 글

비밀번호 찾기 백준 17219번 c++  (0) 2022.02.17
저작권 백준 2914번 c++  (0) 2022.02.17
막대기 백준 1094번 c++  (0) 2022.02.17
수들의 합 백준 1789번 c++  (0) 2022.02.16
좌표 압축 백준 18870번 c++  (0) 2022.02.16

문제 링크 

 

64센티 막대를 반으로 계속 나누게 된다. 

2로 나누면 한 조각이  64 -> 32 ->  16 -> 8 -> 4 -> 2 -> 1  로 쪼개진다. 

 

이 중에 사용할 조각이 있고, 아닌 조각이 있을 것이다.

 

x 센티를 만들기 위해 64센티를 이진수로 바꾸면된다. 

쪼개진 막대를 사용 할지, 말지 선택하는 것과 같다. 

 

 

"맞았습니다" 코드 링크 

#include <bits/stdc++.h>
using namespace std;

int x, cnt;
int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> x;
  while(x >= 1){
    if(x % 2 == 1) cnt++;
    x /= 2;
  }
  cout << cnt;
  return 0;
}
728x90

'알고리즘 > 백준' 카테고리의 다른 글

저작권 백준 2914번 c++  (0) 2022.02.17
민균이의 비밀번호 백준 9933번 c++  (0) 2022.02.17
수들의 합 백준 1789번 c++  (0) 2022.02.16
좌표 압축 백준 18870번 c++  (0) 2022.02.16
수 정렬하기 2 백준 2751번 c++  (0) 2022.02.16
 
합 S가 주어진다. 
합 S가 나오는 서로 다른 ‘최대 개수' N을 찾아야 한다. 서로 다른 수를 더하되 최대 개수니까 1부터 차례로 더한다. 
처음에는 1 더하고. 다음에는 2 더하고. .... 이런 식이다. 
만약 특정 숫자를 더했을 때 s를 초과한다면, 그 직전 개수가 답이 된다. 
 
#include <bits/stdc++.h>
using namespace std;

long long s;

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> s;

  int num = 1; // 더할 수
  int cnt = 0; // 더한 수의 개수
  long long sum = 0; // 누적 합

  while(1){
    sum += num;
    cnt++;
    if(sum > s){
      cnt--;
      break;
    }
    num++;
  }
  cout << cnt;
  return 0;
}
 
728x90
해당 값의 인덱스 위치를 출력하는 find() 함수를 썼을 때 시간초과가 났다. 
find() 함수는 순차탐색 하니까 시간복잡도가 O(N) 이다. 
이미 정렬된 곳에서 탐색하는 거니까 이진 탐색으로 구현된 lower_bound() 를 쓰니까 시간초과가 나지 않았다. 
 

시간복잡도를 비교해보자. 

 
find() O(N)
sort  O(N logN)
 

이진 탐색으로 구현된 lower_bound(), upper_bound()

 lower_bound()  O(log N)
처음 n값이 나오는 위치 반환 
 
upper_bound()  O(log N)
처음으로 n값을 초과하는 위치 반환 
“맞았습니다" 코드 링크
#include <bits/stdc++.h>
using namespace std;

int n, num;
vector<int> v;
vector<int> temp;

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> n;
  for(int i = 0; i <n; i++) {
    cin >> num;
    v.push_back(num); temp.push_back(num);
  }
  sort(v.begin(), v.end()); // [-10, -9, 2, 4, 4]
  v.erase(unique(v.begin(), v.end()), v.end()); // [-10, -9, 2, 4]

  for(auto x : temp){
    cout << lower_bound(v.begin(), v.end(), x) - v.begin() << ' ';
  }

  return 0;
}
 
 
728x90

'알고리즘 > 백준' 카테고리의 다른 글

막대기 백준 1094번 c++  (0) 2022.02.17
수들의 합 백준 1789번 c++  (0) 2022.02.16
수 정렬하기 2 백준 2751번 c++  (0) 2022.02.16
마인크래프트 백준 18111번 c++  (0) 2022.02.14
방 번호 백준 1475번 c++  (0) 2022.02.14
 
100만 이하의 정수를 입력받으니까 양수와 음수 모두 포함이다. 
숫자는 중복되지 않는다. 
수열을 입력 받을 때, 인덱스에 해당하는 숫자가 있다/없다만 1값을 주면서 표시한다. 
음수가 들어올 수 있으니까, 모든 수에 100만을 더한다. 
출력할때는 값이 1인 것만 출력하되, 인덱스에서 100만을 빼면 원래 입력받은 수를 출력할 수 있다. 
 
 
#include "bits/stdc++.h"
using namespace std;

int n, num;
int arr[2000002];

int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> n;
  while(n--){
    cin >> num;
    num += 1000000;
    arr[num]++;
  }
  for(int i = 0; i < 2000002; i++){
    if(arr[i] == 1) {
      cout << i-1000000 << '\n';
    }
  }
  return 0;
}
 
728x90

'알고리즘 > 백준' 카테고리의 다른 글

수들의 합 백준 1789번 c++  (0) 2022.02.16
좌표 압축 백준 18870번 c++  (0) 2022.02.16
마인크래프트 백준 18111번 c++  (0) 2022.02.14
방 번호 백준 1475번 c++  (0) 2022.02.14
영화감독 숌 백준 1436번 c++  (0) 2022.02.14
 
땅의 최소높이, 최대높이를 구해둔다. 
목표 높이 h 를 최소높이 부터 최대 높이 까지 도는 반복문을 만든다. 
반복문 안에서 모든 땅을 h로 만들기 위해 걸리는 시간을 구한다. 
반복문 안에 필요한 지역변수는 inven 과 time 이다. 
 
반복문 한 바퀴가 끝났을 때 인벤이 음수라면, 실패니까 지나간다. 
인벤이 0이상이라면, 최소 시간일 때 시간을 갱신한다. 또한 같은 시간이라도, 땅의 높이가 더 높다면 땅의 높이를 갱신해준다. 
#include <bits/stdc++.h>
using namespace std;

int n, m, b;
int min_height = 256, max_height = 0;
int min_time = 1e9, block_height = 0;
int ground[502][502];

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> n >> m >> b;

  for(int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) { // 블록의 최소 높이와 최대 높이 구하기
      cin >> ground[i][j];
      min_height = min(min_height, ground[i][j]);
      max_height = max(max_height, ground[i][j]);
    }
  }

  // 목표 높이 h : 최소 높이~ 최대 높이 모두 검사한다.
  for(int h = min_height; h <= max_height; h++){
    int temp_time = 0;
    int inven = b;
    int diff = 0;  // 목표높이 h와 현재 땅의 높이 차이

    for(int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) { // 블록의 최소 높이와 최대 높이 구하기

        diff = abs(ground[i][j] - h);
        if(ground[i][j] < h) {  // 낮다면, 시간 2씩 더하고, 인벤에서 꺼내서 쌓아준다
          temp_time += diff;
          inven -= diff;
        }
        else if (ground[i][j] > h){ // 높다면, 시간 1씩 더하고, 인벤에 옮긴다
          temp_time += (2 * diff);
          inven += diff;
        }
      }
    }
    if(inven >= 0){ 
      min_time = min(min_time, temp_time);
      // 답이 여러 개 있다면 그중에서 땅의 높이가 가장 높은 것을 출력
      if(temp_time == min_time) block_height = max(block_height, h);
    }
  }

  cout << min_time << " " << block_height; 

  return 0;
}
 
728x90

'알고리즘 > 백준' 카테고리의 다른 글

좌표 압축 백준 18870번 c++  (0) 2022.02.16
수 정렬하기 2 백준 2751번 c++  (0) 2022.02.16
방 번호 백준 1475번 c++  (0) 2022.02.14
영화감독 숌 백준 1436번 c++  (0) 2022.02.14
랜선 자르기 백준 1652번 c++  (0) 2022.02.14
 
9가 4개, 6이 3개, 나머지 숫자는 1개씩 있다면,  최소 4세트가 필요하다. 
9가 2개, 6이 0개 나머지 숫자는 1개씩 있다면,  최소 1세트가 필요하다. 

[결론]

9와 6을 합했을 때 짝수 개라면, 2로 나눈 숫자만큼의 세트가 필요하다. 
9와 6을 합했을 때 홀수 개라면,  +1 한 만큼에서 2로 나눈 숫자만큼의 세트가 필요하다. 

 

cnt 에는 9와 6을 제외한 숫자의 개수 중에서, 최대 개수를 구한다. 
 
temp_sum은 9와 6의 카드 개수를 전부 누적한다.

 

 
#include <bits/stdc++.h>
using namespace std;

int n, cnt;
int v[11];

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> n;
  string s = to_string(n);
  for(auto num : s){
    v[num - '0']++;
  }

  int temp_sum = 0, temp_cnt = 0; // 9와 6만 센다 

  for(int i = 0; i <= 9; i++){
    if(i == 9 || i == 6) temp_sum += v[i];
    else cnt = max(cnt , v[i]);
  }
  
  if( temp_sum % 2 == 0) temp_cnt = temp_sum / 2;
  else temp_cnt = (temp_sum + 1) / 2;

  cout << max(cnt, temp_cnt);

  return 0;
}
 
728x90

'알고리즘 > 백준' 카테고리의 다른 글

수 정렬하기 2 백준 2751번 c++  (0) 2022.02.16
마인크래프트 백준 18111번 c++  (0) 2022.02.14
영화감독 숌 백준 1436번 c++  (0) 2022.02.14
랜선 자르기 백준 1652번 c++  (0) 2022.02.14
카드 백준 11652번 c++  (0) 2022.02.13

+ Recent posts