본문 바로가기
프로그래밍/개발 이야기

[백준] 1541번 문제풀이

by JR2 2021. 4. 6.

문제 : www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

 

알고리즘 : flag를 이용해서, -가 나오면 다음 연산은 sum을 -시키면 됨.

 

기존에 짰던 코드이다. 보기 복잡하고 코드 재사용도 많다.

일단 풀고보자 라는 느낌으로 코딩을 하였다.

 

근데 잘했던 점은, 성급하게 제출하지 않고 테스트케이스를 여러개 만들어서 테스트 해보고, 디버깅 후에 제출하였다.

짞짞 실력이 늘고있는것 같다.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int charToInt(int* temp);

int main(void)
{
	char arr[51];
	scanf("%s", arr);

	int flag = 0;
	int num, sum = 0;
	int temp[5];
	temp[0] = temp[1] = temp[2] = temp[3] = temp[4] = -1;
	int j = 0;
	for (int i = 0; arr[i] != '\0'; i++)
	{
		if (arr[i] == '-') {
			num = charToInt(temp);
			j = 0;
			if (flag == 1) { sum -= num; }
			else { sum += num; }
			flag = 1; // 이렇게 해야지 기호 다음부터 연산시작
			continue;
		}
		else if (arr[i] == '+') {
			num = charToInt(temp);
			j = 0;
			if (flag == 1) { sum -= num; }
			else { sum += num; }
			continue;
		}
		temp[j++] = arr[i] - 48;
	}
	num = charToInt(temp);
	if (flag == 1) { sum -= num; }
	else { sum += num; }

	printf("%d", sum);

	return 0;
}

int charToInt(int* temp)
{
	int a = 0;
	a = (temp[0] == -1) ? a : temp[0];
	a = (temp[1] == -1) ? a : a * 10 + temp[1];
	a = (temp[2] == -1) ? a : a * 10 + temp[2];
	a = (temp[3] == -1) ? a : a * 10 + temp[3];
	a = (temp[4] == -1) ? a : a * 10 + temp[4];

	temp[0] = temp[1] = temp[2] = temp[3] = temp[4] = -1;
	return a;
}

이렇게 짜는건 아무래도 아닌 것 같아서, 다시 수정하였다.

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int charToInt(int* temp);

int main(void)
{
	char arr[51];
	scanf("%s", arr);

	int flag = 0;
	int num, sum = 0;
	int temp[5];
	temp[0] = temp[1] = temp[2] = temp[3] = temp[4] = -1;
	int j = 0;
	for (int i = 0; arr[i] != '\0'; i++)
	{
		if (arr[i] != '-' && arr[i] != '+') { temp[j++] = arr[i] - 48; continue; }

		num = charToInt(temp);
		j = 0;
		if (flag == 1) { sum -= num; }
		else { sum += num; }

		if (arr[i] == '-') {
			flag = 1; // 이렇게 해야지 기호 다음부터 연산시작
		}
	}
	num = charToInt(temp); // 마지막 숫자도 연산해주어야함.
	if (flag == 1) { sum -= num; }
	else { sum += num; }

	printf("%d", sum);

	return 0;
}

int charToInt(int* temp)
{
	int a = 0;
	a = (temp[0] == -1) ? a : temp[0];
	a = (temp[1] == -1) ? a : a * 10 + temp[1];
	a = (temp[2] == -1) ? a : a * 10 + temp[2];
	a = (temp[3] == -1) ? a : a * 10 + temp[3];
	a = (temp[4] == -1) ? a : a * 10 + temp[4];

	temp[0] = temp[1] = temp[2] = temp[3] = temp[4] = -1;
	return a;
}

확실히 보기 좋다.

 

테스트케이스 : 

55-50+40

40+60-70+30-10+20

30+40+10-40-30-20

50000+50000+50000+50000

50000-50000-50000-50000

2048+2046+10578+00011-88888

 

걸린시간 : 63분 (21분 알고리즘, 42분 코딩 및 디버깅)

'프로그래밍 > 개발 이야기' 카테고리의 다른 글

[백준] 1946번 문제풀이  (0) 2021.04.07
[백준] 2217번 문제풀이  (2) 2021.04.07
[백준] 13305번 문제풀이  (2) 2021.04.06
[백준] 11399번 문제풀이  (0) 2021.04.05
[백준] 16953번 문제풀이  (0) 2021.04.05

댓글