woonadz :)

[백준/C언어] 브루트 포스_2798번_nabi 본문

IT/백준

[백준/C언어] 브루트 포스_2798번_nabi

C_scorch 2021. 10. 17. 01:40
반응형

기록용

3줄 TMI

지난 일주일 정도 공개글 포스팅이 없었다. 지난 일주일간 재귀 2447번을 공개글로 업로드했어야했지만 끝까지 풀지 못했다. 하루에 3시간 정도 약 3일간 풀려고 노력했지만 결국 풀지 못했고 블로그 풀이를 이해하는데도 오랜 시간을 썼다. 블로그 풀이를 이해한 내용으로 작성해서 올릴까 생각도 했지만 내가 푼 풀이가 아니라 올리고 싶지 않았다.

 


 

브루트 포스는 완전 탐색 알고리즘으로 이 문제를 예시로 들면 모든 경우의 수를 계산해보고 가장 정답에 알맞는 것을 고르면 된다. 

수능 공부 시절 이런 문제의 계산을 할 때의 방법을 이용해 풀었다. 1,2,3,4,5 다섯개의 계산을 하고 최댓값을 찾아야 하는 상황이라면 1,2,3 계산 후 1,2,4 -> 1,2,5 ->1,3,4 -> 1,3,5 -> 1,4,5 -> 2,3,4 -> 2,3,5 -> 3,4,5 순으로 계산해 비교했다.

이렇게 머리속으로 구상?을 하고 코드를 짰다. 이제 코드 설명으로 넘어가겠다.

 

#include <stdio.h>

int main() {
	int max = 0; //M을 넘지 않는 가장 큰 합을 넣어주기 위한 변수 선언
	int N, M, sum; //입력 받을 N,M 선언, 3개의 합을 넣어주기 위한 변수 sum 선언
	scanf_s("%d %d", &N, &M);
	int numArr[100]; //입력이 최대 100개까지 가능하므로 공간 100으로 선언
	for (int i = 0; i < N; i++)
		scanf_s("%d", &numArr[i]);
	
	for (int j=0; j<N; j++)
		for (int k=j+1; k<N; k++)
			for (int z = k+1; z < N; z++) {
				sum = numArr[j] + numArr[k] + numArr[z];
				if (sum > M)
					sum = 0; //sum이 M보다 크면 0으로 초기화
				else {
					if (max > sum)
						sum = 0; //sum이 max값보다 작으면 0으로 초기화
					else {
						max = sum; //그 밖의 경우 sum값을 max 변수에 넣어줌
						sum = 0; //sum을 0으로 초기화
					}
				}
			}
	printf("%d", max);

	return 0;
}

 

참고로 백준에 코드를 제출할 때는 scanf_s를 scanf로 바꿔 제출해야한다.

가장 먼저 선언해준 max의 용도는 M을 넘진 않지만 가장 가까운 합을 넣어주기 위한 용도이다. 

이후 sum은 3개 수들의 합을 넣어주기 위한 용도이다. 

입력을 어떤식으로 받을지 고민했는데 아무래도 배열이 가장 쉬운 방법 같아 N에 해당하는 수들은 배열을 이용해 입력받았다. 문제의 조건에서 N의 개수는 3개 이상 100개 이하이므로 최대 100개까지 숫자를 입력 받을 때는 생각해 배열의 크기를 100으로 선언했다.

for 반복문 속 for 반복문은 상위 반복문이 1회 시행 될 때 하위 반복문은 끝까지 시행된다는 점을 이용해 위에 말한 계산 방법을 구현했다.

for문 속 if문에서는 만약 sum이 M보다 크다면 다시 sum 값을 0으로 초기화해줌으로써 다른 수식들을 계산 할 수 있게 했다. 그 밖에 경우에 대해서는 max에 담긴 값이 sum값보다 크다면 다시 sum값을 0으로 초기화해주고 아니라면 max 변수에 sum값을 갱신해주고 sum값을 0으로 초기화했다.

 

 

(갑자기 생각이 나 친구의 코드도 다시 보고 왔다. 저번주 스터디 때는 생각하지 못했는데 내가 필요없는 코드 부분을 짰다는 것을 알았다. 또 개발자 친구의 코드를 보고 알았다. 주석을 달면 되는걸 왜 난 줄글로 설명을 하려했을까... 참ㅎ

미숙한 점도 많고 부족한 실력을 가지고 있는 나지만 이렇게 하나 하나 채워가면 될 듯하다.)

위에 말한 필요없는 코드 부분은 가장 하위 for문 안에 있는 if문들의 구조이다. 중첩 if문 없이 짤 수 있는 코드였고 굳이 sum을 0으로 초기화해줄 필요도 없다. 어차피 갱신되니까...

 

 

 

 

 

 

 

 

 


끝인사 및 느낀점

저번주에 재귀를 공부하며 많은 시간을 투자했음에도 3X3까지 밖에 구현하지 못하는 내가 너무 바보 같았고 부족한게 느껴져 열의를 불태우기도 했다. 스터디 시간에 블로그 리뷰를 하며 한번 같이 코드를 해석해봤는데 그마저도 오래걸렸다. 재귀 개념을 공부한 후에 재귀를 이용해 짧고 가독성 좋은 코드를 구현하고 싶었지만 마음처럼 되지 않았다. 블로그 코드를 보고 다시 풀어봐도 이런 생각을 어떻게 했을까라는 생각밖에 나지 않았다. 앞으로 스터디를 잘 진행할 수 있을지 막막했지만 절대 포기하지는 않을 것이다. 이제는 이런 생각이 든다. 아직 기초가 부족하니 실력을 더 키우고 도전하자 이런 말들은 겉으로 보기엔 옳은 말처럼 보인다. 하지만 그 말을 다르게 해석한다면 그저 핑계일 뿐이다. 지금은 알고리즘 공부하며 이게 맞나 싶지만 한달이 되고 두달이 되고 일년이 되면 많이 늘었다는 걸 느낄 수 있다고 믿어의심치않는다.

 

오늘 포스팅을 쓰다 일어난 일인데 내가 정말 이 분야에 진심이구나 싶어서 기록하게 되었다. 아빠가 뉴스를 틀어놓고 주무시는데 뉴스에서 스푸핑에 대한 처벌이 강화된다고 보도했다. 그래서 너무 궁금해 글을 쓰다 말고 뛰쳐나갔다. 알고보니 스푸핑이 아닌 스토킹이었다...ㅎㅎ 뛰쳐나가면서 '스푸핑 처벌이 강화된다고? 어떤식으로?' , '최근 스푸핑과 관련된 큰 사건이 있었나?' 막 이런 생각을 했다. 별거 아니지만 내가 정말 흥미를 느끼며 공부를 하고 있는 중이라는 걸 알았다. 요즘 나의 모든 사고방식이 보안,개발과 관련하여 작동한다. 우리 과에서 배우는 내용에 매우 흥미를 가지고 있고 내가 스터디를 즐기며 하고 있다는 것이 신기하다. 

반응형