땅의 최소높이, 최대높이를 구해둔다. 
목표 높이 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
 
시작 수 666부터 1씩 더해가면서 검사한다. 
숫자가 증가할 때마다 to_string(숫자) 함수로 문자열 변환을 해준다. 
string 에서 substring 의 포함여부를 검색하는데 find() 함수를 썼다. 
 
문자열“666”이 포함되면 0을 포함한 인덱스를 반환해준다.
포함되지 않으면, 엄청나게 큰 수를 반환한다. 
이 때, -1 보다는 string::npos 를 써서 검사하자. 
 
#include <bits/stdc++.h>
using namespace std;

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

  cin >> n;

  string target = "666";
  int num = 665;
  int count = 0;

  while(++num){
    s = to_string(num); // int to string
    if(s.find(target) != string::npos) ++count; // 타겟이 존재한다면 카운팅한다.
    if(count == n) break;
  }
  cout << num;
  return 0;
}
 
728x90

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

마인크래프트 백준 18111번 c++  (0) 2022.02.14
방 번호 백준 1475번 c++  (0) 2022.02.14
랜선 자르기 백준 1652번 c++  (0) 2022.02.14
카드 백준 11652번 c++  (0) 2022.02.13
쇠막대기 백준 10799번 c++  (0) 2022.02.13
 
중요한 이분탐색 문제. 
 
서로다른 길이를 a로 나눠서 n개 이상의 랜선을 만들어야 한다. 
a로 나눠야 하는 최소 길이는 1이다. 
최대 길이는 주어진 랜선 중에 가장 긴 랜선이다. 
 
1부터 최대 길이까지 나눠보는데, 이분 탐색을 이용한다. 
기본은 (low + high ) / 2 = mid 임을 이용한다. 
mid 길이로 모든 랜선을 나눠서 몇 개 count 의 랜선이 나오는지 센다. 
 
만약 결과count가 목표개수 n 보다 적게 나온다면, 더 짧은 길이로 나눠야 더 많은 개수가 나올 것이다. 
따라서  count < n 이라면,  최대 길이 end = mid -1 로 줄인다. 
 
count가 n개와 같거나 크다면, start = mid +1 로 늘려서 더 길게 나눠도 n개 이상임을 만족하는지 탐색한다. 
 
#include <bits/stdc++.h>
using namespace std;

int k, n; // 가지고있는 랜선 개수, 필요한 개수
int maxlen;
int line[10002];
long long mid, high, low;

int count(int t){
  int cnt = 0 ;
  for(int i = 0; i < k; i++) cnt += (line[i] / t);
  return cnt;
}

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

  cin >> k >> n;

  for(int i = 0; i < k; i++){
    cin >> line[i];
    if(maxlen < line[i]) maxlen = line[i];
  }

  high = maxlen, low = 1; //최대길이, 최소길이
  long long answer = 0;

  while(low <= high){ /* 이분탐색 */
    mid = (low + high)/ 2;
    int cnt = count(mid); // 개수 세기 

    if(cnt >= n) {
      low = mid + 1;
      if(answer < mid) answer = mid;
    }
    else {
      high = mid - 1;
    }
  }

  cout << answer;
  return 0;
}
 
 
#include <bits/stdc++.h>
using namespace std;

int k, n;
long long answer, maxlen;
long long v[10002];

int count(int temp){
  int cnt = 0;
  for(int i = 0; i < k; i++) cnt += (v[i] / temp);
  return cnt;
}

void binary(long long start, long long end){
  if(start > end) return;

  long long mid = (start + end)/2;
  long long cnt = count(mid); 개수 세기 

  if(cnt >= n){
    answer = max(answer, mid);
    binary(mid + 1, end);
  }
  else{
    binary(start, mid - 1);
  }
}
int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> k >> n;

  for(int i = 0; i < k; i++){
    cin >> v[i];
    maxlen = max(maxlen, v[i]);
  }

  binary(1, maxlen);
  cout << answer;
  return 0;
}
 
 
728x90

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

방 번호 백준 1475번 c++  (0) 2022.02.14
영화감독 숌 백준 1436번 c++  (0) 2022.02.14
카드 백준 11652번 c++  (0) 2022.02.13
쇠막대기 백준 10799번 c++  (0) 2022.02.13
괄호 백준 9012번 c++  (0) 2022.02.13
같은 숫자를 가진 카드가 몇개씩 있는지 세야 한다. 
 
/** 카드
 
 */
#include <bits/stdc++.h>
using namespace std;

int n, maxnum;
long long num, answer;
map<long long, int> card_map; //<숫자, 개수>

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

  cin >> n;
  while(n--){
    cin >> num;
    card_map[num]++;
  }

  for(auto n : card_map){
    if(n.second > maxnum) {
      maxnum = n.second;
      answer = n.first;
    }
  }
  cout << answer;

  return 0;
}

 
숫자 마다의 개수를 저장해야 하니까 map 으로 입력받았다. <숫자, 카드의 개수> 
 
최대 카드 개수가 10만 이하여서 한번 반복문으로 순회했다. 
 
개수가 가장 많은 것을 만나면 maxnum으로 저장하고, 그 숫자를 answer에 저장했다. 
728x90

문제링크

 

스택을 이용해 풀었다. 

( ) 이렇게 레이저를 쏠 때 스택에 아무것도 없으면 막대 조각이 생성되지 않는다. 

 

괄호가 레이저를 쐈는지 식별하려면?

지금 문자열이  ) 이고, 이전이 ( 인지 확인하면 된다. 

 

 ( 는 막대가 시작하는 지점이다. 

 

( ( ) ) 길이 1의 막대에 레이저 1번 쏘면, 길이 1 + 현재 스택길이 1 ==> 총 조각 2개가 생성된다. 

( ( ( ) ) ) 길이 2의 막대에 레이저 1번 쏘면, 길이 2 + 현재 스택길이 2 ==> 총 4개가 생성된다. 

 

) 는 막대가 끝나는 지점이니까 answer 에 +1을 한다. 

 

맞았습니다 코드링크

/** 쇠막대기
 https://www.acmicpc.net/problem/10799
 http://boj.kr/4fcfe35ad9a14a5898bf22af9c5f25c9
 */

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

long long answer;
string input;

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

  cin >> input;

  stack<char> st;
  int len = input.length();
  for(int i = 0; i < len; i++){

    if(input[i] == '(') {
      st.push(input['i']);
    }
    else if(input[i-1] == '(' && input[i] == ')'){ // 레이저
      st.pop();
      answer += st.size();
    }else { // 막대의 마지막 꼬다리
      answer++;
      st.pop();
    }
  }

  cout << answer;
  return 0;
}
728x90

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

랜선 자르기 백준 1652번 c++  (0) 2022.02.14
카드 백준 11652번 c++  (0) 2022.02.13
괄호 백준 9012번 c++  (0) 2022.02.13
좋은 단어 백준 3986번 c++ (두번째 풀기)  (0) 2022.02.11
Hasing 백준 15829번 c++  (0) 2022.02.11
 
스택을 이용한 기본 문제였다. 
항상 top()을 접근하기 전에 스택이 empty() 인지를 확인해야 한다! (이걸 자주 빠뜨렸었다. )
( 이면 푸시한다. 
) 가 나오면, 현재 스택이 비어있지 않은지 확인하고, top() 이 ( 인지 확인한다. 
( 과 )는 짝이 맞는 괄호이기 때문에, 현재 top() 인 (를 팝 한다. 
오늘은 한 번에 맞았다. 
 
 
/** 괄호
 https://www.acmicpc.net/problem/9012
 http://boj.kr/ac1a8f71cfbe4c62abbc1aa710778283
 */
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;

int t;
string input;

bool check(string s){
  stack<char> st;
  for(auto i : s){
    if(i == '(') st.push('(');
    else if(!st.empty() && st.top() == '('){
      st.pop();
    }else return false;
  }

  if(st.empty()) return true;
  else return false;
}
int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> t;

  while(t--){
    cin >> input;
    if(check(input)) cout << "YES" << endl;
    else cout << "NO" << endl;
  }

  return 0;
}
728x90

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

카드 백준 11652번 c++  (0) 2022.02.13
쇠막대기 백준 10799번 c++  (0) 2022.02.13
좋은 단어 백준 3986번 c++ (두번째 풀기)  (0) 2022.02.11
Hasing 백준 15829번 c++  (0) 2022.02.11
시리얼 번호 백준 1431번 c++  (0) 2022.02.10

+ Recent posts