※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 3042번 문제인 트리플렛이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/3042
3042번: 트리플렛
상근이와 창영이는 트리플렛이라는 게임을 하고 있다. 이 게임을 하려면 칠판에 N*N 그리드를 그려야 한다. 그 다음 알파벳 대문자를 적절히 각 칸에 써 넣는다. 한 알파벳을 여러 칸에 쓸 수는
www.acmicpc.net
칠판에 적힌 문자의 개수는 많아야 26개(대문자 알파벳의 가짓수)와 같음을 관찰하자. 그러므로 가능한 모든 "문자가 있는 세 칸을 고를 경우의 수"는 26가지 문자 중 3가지를 고르는 경우의 수인 2600가지이다.
경우의 수가 충분히 적으므로, 문자가 적힌 칸의 좌표들을 미리 전처리해둔 배열을 준비해두고 모든 위와 같은 경우에 대하여 세 지점이 일직선 위에 놓여있는지를 판별해 문제를 해결하자. 글쓴이는 이를 판별하기 위해 세 좌표를 A, B, C라 할 때 A와 B를 잇는 선분의 기울기와 B와 C를 잇는 선분의 기울기가 같은지를 확인하였다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int N;
string board[100];
int psize;
vector<pair<int, int>> points;
int ans;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int r = 0; r < N; r++) cin >> board[r];
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
if (board[r][c] != '.') points.emplace_back(make_pair(r, c));
}
}
psize = points.size();
for (int i = 0; i < psize; i++) {
for (int j = i + 1; j < psize; j++) {
int dx1 = points[j].first - points[i].first, dy1 = points[j].second - points[i].second;
for (int k = j + 1; k < psize; k++) {
int dx2 = points[k].first - points[j].first, dy2 = points[k].second - points[j].second;
if (dx1 == 0 && dx2 == 0) ans++;
else if (dx1 * dx2 && dy1 * dx2 == dx1 * dy2) ans++;
}
}
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 16173 // C++] 점프왕 쩰리 (Small) (0) | 2023.02.18 |
---|---|
[BOJ 1184 // C++] 귀농 (0) | 2023.02.18 |
[BOJ 3043 // C++] 장난감 탱크 (0) | 2023.02.18 |
[BOJ 16174 // C++] 점프왕 쩰리 (Large) (0) | 2023.02.17 |
[BOJ 3186 // C++] 소변기 (0) | 2023.02.17 |