[C++] 1120번: 문자열

2023. 8. 10. 02:22·[게임 개발] 알고리즘 공부/백준

링크

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

 

1120번: 문자열

길이가 N으로 같은 문자열 X와 Y가 있을 때, 두 문자열 X와 Y의 차이는 X[i] ≠ Y[i]인 i의 개수이다. 예를 들어, X=”jimin”, Y=”minji”이면, 둘의 차이는 4이다. 두 문자열 A와 B가 주어진다. 이때, A의

www.acmicpc.net

문제

길이가 N으로 같은 문자열 X와 Y가 있을 때, 두 문자열 X와 Y의 차이는 X[i] ≠ Y[i]인 i의 개수이다. 예를 들어, X=”jimin”, Y=”minji”이면, 둘의 차이는 4이다.

두 문자열 A와 B가 주어진다. 이때, A의 길이는 B의 길이보다 작거나 같다. 이제 A의 길이가 B의 길이와 같아질 때 까지 다음과 같은 연산을 할 수 있다.

  1. A의 앞에 아무 알파벳이나 추가한다.
  2. A의 뒤에 아무 알파벳이나 추가한다.

이때, A와 B의 길이가 같으면서, A와 B의 차이를 최소로 하는 프로그램을 작성하시오.

입출력 예제

입력

첫째 줄에 A와 B가 주어진다. A와 B의 길이는 최대 50이고, A의 길이는 B의 길이보다 작거나 같고, 알파벳 소문자로만 이루어져 있다.

출력

A와 B의 길이가 같으면서, A와 B의 차이를 최소가 되도록 했을 때, 그 차이를 출력하시오.

예제 입력 1 복사
adaabc aababbc
예제 출력 1 복사
2
예제 입력 2 복사
hello xello
예제 출력 2 복사
1
예제 입력 3 복사
koder topcoder
예제 출력 3 복사
1
예제 입력 4 복사
abc topabcoder
예제 출력 4 복사
0
예제 입력 5 복사
giorgi igroig
예제 출력 5 복사
6

코드

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <cmath>
#include <queue>
#include <stack>

using namespace std;

int main(void)
{
	cin.tie(NULL);
	cout.tie(NULL);
	ios_base::sync_with_stdio(false);

	int correct = 0;
	int wrong = 0;

	string x, y;
	cin >> x >> y;

	for (int i = 0; i <= y.size() - x.size(); i++)
	{
		int correct_temp = 0;
		int wrong_temp = 0;

		for (int j = i; j < x.size() + i; j++)
		{
			if (x[j-i] == y[j])
				correct_temp++;
			else
				wrong_temp++;
		}

		if (correct <= correct_temp)
		{
			correct = correct_temp;
			wrong = wrong_temp;
		}
	}

	cout << wrong << endl;

	return 0;
}

풀이

  • 문자열 x와 y가 주어졌을 때 x는 y보다 작거나 같다는 점을 이용하였다.

x가 붉은색, y가 검은색 글씨라고 할 때 x를 y와 비교해서 각 자리와 일치하는 글자,

틀린글자를 체크해서 갯수를 구한다.
이 때 구한 일치하는 글자가 저장된 일치하는 글자보다 많은 경우
구한 일치하는 글자 수와 틀린 글자 수를 새로 저장한다.

 

위와 같은 방식으로  y.size() - x.size() + 1 번 만큼 반복해서 주어진 문자열을 모두 탐색하도록 한다.

앞 뒤로 원하는 문자열을 넣을 수 있다는 특성 때문에 가장 많은 일치하는 글자를
남기는 구간이 가장 적은 문자열의 차이를 나타내는 구간이고 이 구간의 값이 곧 정답이 된다.

 

adaabc aababbc

위 예시에서는 

adaabc를 기준으로 할 때

aababb와 ababbc 두개의 문자열과 비교하게 되는데

ababbc 문자열이 일치하는 문자 4개, 틀린글자 2개로 가장 최선의 결과를 나타내고

정답은 2개가 된다.

저작자표시 (새창열림)

'[게임 개발] 알고리즘 공부 > 백준' 카테고리의 다른 글

[C++] 5568번: 카드 놓기  (0) 2023.08.13
[C++] 1182번: 부분수열의 합  (0) 2023.08.12
[C++] 1051번: 숫자 정사각형  (0) 2023.08.08
[C++] 13975번: 파일 합치기 3  (0) 2023.08.07
[C++] 2141번: 우체국  (0) 2023.08.06
'[게임 개발] 알고리즘 공부/백준' 카테고리의 다른 글
  • [C++] 5568번: 카드 놓기
  • [C++] 1182번: 부분수열의 합
  • [C++] 1051번: 숫자 정사각형
  • [C++] 13975번: 파일 합치기 3
람팜팜~
람팜팜~
:)
  • 람팜팜~
    RumPumPum
    람팜팜~
  • 전체
    오늘
    어제
    • 전체 (123)
      • 🎵 일상 (2)
      • JAVA (5)
        • 김영한의 자바 입문 (3)
      • JavaScript (12)
      • ---------------------------.. (0)
      • [게임 개발] 포트폴리오 (2)
        • RPG (1)
        • 슈터-플랫포머 (1)
      • [게임 개발] 개발 일지 (28)
        • RPG (25)
        • TopDownProject (3)
      • [게임 개발] 언리얼엔진 공부 (9)
        • 이득우의 언리얼 프로그래밍 Part.1 (6)
        • 이득우의 언리얼 프로그래밍 Part.2 (1)
        • 개인 메모 (2)
      • [게임 개발] 알고리즘 공부 (60)
        • 프로그래머스 (8)
        • 백준 (52)
        • 개인 메모 (0)
      • [게임 개발] CPP 공부 (2)
        • 이것이 C++ 이다 (1)
        • Effective C++ (0)
        • Effective Modern C++ (0)
        • 홍정모 그래픽스 새싹코스 (1)
      • [게임 개발] CS 공부 (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      그리디
      투포인터
      dp
      데드락
      문자열
      메모리구조
      브루트포스
      context switching
      누적합
      dfs
      스레드
      우선순위 큐
      슬라이딩 윈도우
      참조자
      프로세스
      역참조
      해시
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    람팜팜~
    [C++] 1120번: 문자열
    상단으로

    티스토리툴바