TIL day 76

2025. 4. 8. 11:52·TIL

1. 코딩테스트


class 5의 용액 문제를 풀었습니다.

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

더보기
#include <iostream>
#include <climits>
using namespace std;

int n;
int board[100'002];
int answer = INT_MAX;
pair<int, int>ans;

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> n;
	
	fill(board, board + 100002, INT_MAX);

	for (int i = 0; i < n; ++i)
	{
		cin >> board[i];
	}
	
	int st = 0;
	int en = n - 1;

	while (st < en)
	{
		int sum = board[st] + board[en];
		if (answer > abs(sum))
		{
			answer = abs(sum);
			ans = make_pair(board[st], board[en]);
		}
		//음수
		if (sum < 0)
			st++;
		else
			en--;
	}

	cout << ans.first << " " << ans.second;
	
}
  • 처음에 문제를 보고 바로 투포인터라고 생각은 들었는데, 투포인터를 오랜만에 접하다보니 쉽게 풀지는 못했습니다.
  • 투포인터쪽도 좀 더 템플릿을 만들어서 문제를 풀어봐야할 것 같다는 생각이 들었습니다.
  • 생각의 흐름
    • st와 en을 둘 다 왼쪽에서 시작해서, 다음 값이 더 커진 경우 st를 증가시키고 아닌 경우는 en을 증가하는 식으로 구현했는데 예외가 생기는지 쉽게 풀리지 않았습니다.
    • 그래서 st와 en을 양 끝으로 두고, 다가오는 방향으로 생각해 보았고, 합이 음수가 되는 것을 기준으로 해결하였습니다.

class 4 의 거짓말 문제를 풀었습니다.

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

더보기
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int n, m;
int t;
int tarr[52];
vector<int> Data[52];
vector<int> adj[52];
int vis[52];
int answer = 0;

void bfs(int cur)
{
	queue<int>q;
	q.push(cur);
	vis[cur] = 1;

	while (!q.empty())
	{
		int cur = q.front();
		q.pop();

		for (int nxt : adj[cur])
		{
			if (!vis[nxt])
			{
				vis[nxt] = 1;
				q.push(nxt);
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	//사람, 파티
	cin >> n >> m;
	//진실
	cin >> t;
	for (int i = 0; i < t; ++i)
	{
		cin >> tarr[i];
	}
	
	for (int i = 0; i < m; ++i)
	{
		int p;
		cin >> p;
		for (int j = 0; j < p; ++j)
		{
			int num;
			cin >> num;
			Data[i].push_back(num);			
		}
		for (int j = 0; j < Data[i].size() - 1; ++j)
		{
			adj[Data[i][j]].push_back(Data[i][j + 1]);
			adj[Data[i][j + 1]].push_back(Data[i][j]);
		}
	}

	for (const auto& ta : tarr)
	{
		bfs(ta);
	}

	for (int i = 0; i < m; ++i)
	{
		bool fun = true;
		for(int j = 0 ; j < Data[i].size();++j)
		{
			if (vis[Data[i][j]])
			{
				fun = false;
				break;
			}
		}
		if (fun)
			answer++;
	}
	cout << answer;
}
  • 처음 보고, 그래프 구성해서 연관된 것들을 체크 후 (bfs) 다시 모든 경우의 수를 돌면서 해당하는 경우의 수를 더해주면 될 것이라는 생각을 했습니다.
  • 생각의 흐름
    • Data라는 답을 내기 위해서 입력받은 값들을 넣은 벡터를 구성합니다.
    • 이후로 adj라는 인접리스트 형식의 그래프를 구성하고, 진실을 아는 사람들을 하나씩 시작점으로 선택하여 bfs를 돌리면 그 결과 진실을 알게된 사람들이 체크가 됩니다.
    • 마지막으로 Data 를 돌면서 방문한 경우(vis가 true면, 진실을 아는 사람) 를 제외하고 answer를 더해주어 답을구했습니다.
  • 좀 더 깔끔하게 풀 수 있을것 같기도 한데, 일단 생각의 흐름을 따라서 코드를 작성하니 조금 복잡하게 된 것 같기도 합니다.

 

 

2. 언리얼


 

 

'TIL' 카테고리의 다른 글

TIL day 78  (0) 2025.04.10
TIL day 77  (0) 2025.04.09
TIL day 75  (0) 2025.04.07
TIL day 74  (0) 2025.04.04
TIL day 73  (0) 2025.04.03
'TIL' 카테고리의 다른 글
  • TIL day 78
  • TIL day 77
  • TIL day 75
  • TIL day 74
gbleem
gbleem
gbleem 님의 블로그 입니다.
  • gbleem
    gbleem 님의 블로그
    gbleem
  • 전체
    오늘
    어제
    • 분류 전체보기 (176)
      • Unreal Engine (66)
      • C++ (19)
      • 알고리즘(코딩테스트) (26)
      • TIL (60)
      • CS (4)
      • 툴 (1)
  • 블로그 메뉴

    • 홈
    • 카테고리
  • 링크

    • 과제용 깃허브
    • 깃허브
    • velog
  • 공지사항

  • 인기 글

  • 태그

    템플릿
    상속
    addonscreendebugmessage
    DP
    C++
    gamestate
    motion matching
    싱글턴
    blend pose
    BFS
    매크로 지정자
    Vector
    const
    additive animation
    enhanced input system
    character animation
    applydamage
    actor 클래스
    cin함수
    map을 vector로 복사
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gbleem
TIL day 76
상단으로

티스토리툴바