[210214][백준/BOJ] 11328번 Strfry

KeonWoo Kim·2021년 2월 14일
0

알고리즘

목록 보기
11/84

문제

입출력


풀이

입력받은 두개의 문자열을 크기가 26인 각각의 배열에 넣은 뒤에 일치하는지 여부 확인하며 문제를 해결하면 된다.

  1. str1[i]-97을 통해 각 알파벳의 위치를 0부터 25까지로 나타낼 수 있다.
  2. 두개의 배열은 첫번째 반복문이 돌때마다 초기화를 시켜줘야한다. 이는 반복문 안에 배열을 선언해서 해결할 수도 있고 fill함수를 통해 해결할 수도 있다. 나는 fill함수를 사용하였다.
  3. 두개의 문자열이 크기가 다른 경우도 생각해줘야 한다.

코드

#include <bits/stdc++.h>

int arr1[26], arr2[26];

int main() {

	int n;
	char str1[1000], str2[1000];
	
	scanf("%d", &n);

	for(int i=0;i<n;i++)
	{
		bool res = true;
		std::fill(arr1, arr1 + 26, 0);
		std::fill(arr2, arr2 + 26, 0);

		scanf("%s %s", &str1, &str2);

		if (strlen(str1) != strlen(str2)) 
			printf("Impossible\n");
		else 
		{
			for (int i = 0; i < strlen(str1) ; i++) 
			{
				arr1[str1[i] - 97]++;
				arr2[str2[i] - 97]++;
			}
			for (int i = 0; i < 26; i++) {
				if (arr1[i] != arr2[i]) 
				{
					res = false;
					break;
				}
			} 
			if (res)
				printf("Possible\n");
			else
				printf("Impossible\n");
		}
	}
}

느낀점

문제를 해결하는데 대략 한시간 정도 소모된거 같다.
시간이 많이 걸린 이유를 나름대로 생각해보니 몇가지가 있는거 같다.

일단 큰 틀은 잡고 문제를 풀어서 vs2019에서는 정답이 나왔으나 채점을 해보면 계속 틀렸다.
이는 다른 케이스는 해결못하였기 때문이다. 예를 들어 두 문자열의 크기가 다른 경우도 생각했어야 했다.

그리고 반복문을 돌면서 배열을 계속 초기화해줘야 한다는것은 생각하지 못하였다.
fill 함수라는것을 처음 알게 되었다.

또한 기존에는 조건문이 실행될때 보통 변수 cnt에 ++를 통해 값을 증가시키면서 정답을 유추하고는 했다.
이러한 방식이 틀린것은 아니지만 bool 형식을 통해서도 문제를 해결할 수 있다는 것을 알게되었다.

앞으로 아무리 쉬운 문제라도 의심하면서 여러가지 케이스를 생각해보고 문제를 푸는 습관을 들여야겠다.

profile
안녕하세요

0개의 댓글

관련 채용 정보