dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • 프로그래머스
  • BFS
  • 그래프탐색
  • 일기
  • c++
  • HackerRank mysql
  • 서블릿
  • 네이버 부스트캠프
  • 프로그래머스 SQL
  • 부스트캠프
  • 반성
  • 백준 DP
  • dp
  • 백준
  • 기록
  • Baekjoon
  • Hackerrank
  • 스프링
  • AI Tech
  • 회고

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

문제 풀이/백준 알고리즘

[baekjoon 12904] A와 B (문자열, 그리디) (C++)

2021. 9. 5. 00:19
728x90

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

 

12904번: A와 B

수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수

www.acmicpc.net

시작 단어에서 뒤에 A를 붙이거나, 단어를 뒤집어서 B를 붙이거나 해서 목표 단어까지 만들 수 있는지의 여부를 계산해내는 문제이다.

 

처음엔 아무 생각 없이 DFS로 매번 A를 붙이거나, B를 붙였더니 시간 초과가 났다.

그도 그럴 것이, 시작 단어가 1글자에서 시작하고 목표 단어가 1000 글자면 매 단계마다 2번 ^ 1000이다.

4글자 단어를 만드는데 2^0 + 2^1 + 2^2 + 2^3 = 2^4 - 1번의 함수 호출이 필요하다.

1000 길이의 문자열을 만드는데 대략 2^1000의 계산이 필요할 것이다.

 

따라서, 생각을 바꿔서 그리디 하게 목표 단어에서 시작 단어로 만들어보면 되지 않을까?

 

목표 단어의 끝이 B로 끝나면 B를 지워주고 단어를 뒤집어준다.

끝이 A로 끝나면 그냥 A만 지워준다.

그리고 시작 단어와 비교해서 맞으면 종료해주면 된다.

 

이 방법의 최악은 시작 글자는 1글자, 목표 글자는 1000 글자가 모두 B로 된 "BBBBBB... BB"일 것이다.

매번 삭제하고, reverse 해줘야 하기 때문이다.

그래도 O(N^2)으로 판단된다. 매 글자 수 * reverse 연산.. (reverse 연산도 결국 문자열을 하나하나 뒤집어야 하니 o(n)이 아닐까?)

#include <iostream>
#include <algorithm>

using namespace std;

string A, B;
int flag = false;

// 목표를 만들어가지말고 목표를 역으로 바꾸면서 시작점이 될 수 있는지 그리디하게 접근하자

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> A >> B;
	
	while (B.size() > 0) {
		if (B.back() == 'B') {
			B.erase(B.end() - 1);
			reverse(B.begin(), B.end());
		}
		else
			B.erase(B.end() - 1);

		if (B == A) {
			flag = true;
			break;
		}
	}

	if (flag)
		cout << 1;
	else
		cout << 0;
}

 

 

 

728x90
저작자표시 비영리 변경금지 (새창열림)

'문제 풀이 > 백준 알고리즘' 카테고리의 다른 글

[baekjoon 2800] 괄호 제거 (스택, 구현, 재귀) (C++)  (0) 2021.09.20
[baekjoon 2696] 중앙값 구하기 (우선순위 큐) (C++)  (2) 2021.09.07
[baekjoon 3079] 입국심사 (매개변수탐색, 이분탐색) (C++)  (0) 2021.09.03
[baekjoon 2075] N번째 큰 수 (우선순위큐, 정렬) (C++)  (0) 2021.08.31
[baekjoon 11659] 구간 합 구하기 4 (누적합) (C++)  (0) 2021.08.28
    '문제 풀이/백준 알고리즘' 카테고리의 다른 글
    • [baekjoon 2800] 괄호 제거 (스택, 구현, 재귀) (C++)
    • [baekjoon 2696] 중앙값 구하기 (우선순위 큐) (C++)
    • [baekjoon 3079] 입국심사 (매개변수탐색, 이분탐색) (C++)
    • [baekjoon 2075] N번째 큰 수 (우선순위큐, 정렬) (C++)
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바