#include
bool plag = true;
struct vote {
int cnt, sub[4];
vote() {
int i;
for (i = 1; i <= 3; i++) {
sub[i] = 0;
}
cnt = 0;
}
} abc[3];
void input() {
int loop, i, j, imsi;
scanf("%d", &loop);
for (i = 0; i < loop; i++) {
for (j = 0; j < 3; j++) {
scanf("%d", &imsi);
abc[j].cnt += imsi;
abc[j].sub[imsi]++;
}
}
}
bool whats(const int a, const int b) {
int i;
for (i = 3; i >= 1; i--) {
if (abc[b].sub[i] < abc[a].sub[i]) return true;
else if (abc[b].sub[i] > abc[a].sub[i]) return false;
}
plag = false;
return false;
}
void process() {
int i, max = -1, imsi, cnt;
for (i = 0; i < 3; i++) {
if (max < abc[i].cnt) {
max = abc[i].cnt;
cnt = 1;
imsi = i;
}
else if (max == abc[i].cnt) cnt++;
}
if (cnt > 1) {
imsi = 0;
for (i = 1; i < 3; i++) {
if (max == abc[i].cnt && whats(i, imsi)) imsi = i;
}
}
if (plag) printf("%d %d\n", imsi + 1, max);
else printf("%d %d\n", 0, max);
}
int main() {
input();
process();
return 0;
}
#include
#include
bool plag = true;
struct vote {
int cnt = 0, sub[4] = { 0 };
} abc[3];
void in()
{
int j, imsi;
for (j = 0; j < 3; j++) {
scanf("%d", &imsi);
abc[j].cnt += imsi;
abc[j].sub[imsi]++;
}
}
void input() {
int loop, i;
std::thread* th;
scanf("%d", &loop);
in();
th = new std::thread[loop-1];
for (i = 0; i < loop-1; i++) {
th[i] = std::thread(in);
}
for (i = 0; i < loop-1; i++) {
th[i].join();
}
delete[] th;
}
bool whats(const int a, const int b) {
int i;
for (i = 3; i >= 1; i--) {
if (abc[b].sub[i] < abc[a].sub[i]) return true;
else if (abc[b].sub[i] > abc[a].sub[i]) return false;
}
plag = false;
return false;
}
void process() {
int i, max = -1, imsi, cnt;
for (i = 0; i < 3; i++) {
if (max < abc[i].cnt) {
max = abc[i].cnt;
cnt = 1;
imsi = i;
}
else if (max == abc[i].cnt) cnt++;
}
if (cnt > 1) {
imsi = 0;
for (i = 1; i < 3; i++) {
if (max == abc[i].cnt && whats(i, imsi)) imsi = i;
}
}
if (plag) printf("%d %d\n", imsi + 1, max);
else printf("%d %d\n", 0, max);
}
int main() {
input();
process();
return 0;
}
입력의 첫째 줄에는 반의 학생들의 수 N(3≤N≤1,000)이 주어지고 다음 N개의 각 줄에는 각 학생이 제출한 회장후보 3명에 대한 선호 점수가 주어지며 첫 번째 점수는 후보 1번에 대한 점수이고 두 번째 점수는 후보 2번에 대한 점수이고 세 번째 점수는 후보 3번에 대한 점수입니다. 이 세 점수는 서로 다르며, 1, 2, 3이 정확히 한 번씩 나타납니다. 위의 코드는 원래 코드이고 아래는 std::thread 클래스를 부분적으로 적용해보았습니다. 문제점은 첨부한 사진에서 보시듯이 입력한 값이 같은데도 맨아래의 출력되는 결과값이 다르게 나옵니다. 저 입력값의 올바른 출력값은 "3 101" 입니다. 디버깅을 해보면 입력받을때 in()함수 내부에서 입력받을때 변수를 입력받는 순서... 즉 in함수내부의 for문이 한번에 입력받는것이 아닌 스레드중 이미 작업을 마친것이 다른 스레드의 영역을 침범하여 생기는 문제로 추정되는 것 같습니다. 이에 대한 해결방법을 제시해주세요.