문제출처: https://www.acmicpc.net/problem/13300


풀이

2개의성별, 6개의 학년이 있기 때문에 총 12가지의 경우가 생깁니다. 2차원 배열이 바로 떠올랐고 이를 이용해 간단하게 풀 수 있었습니다.

필요한 방의 갯수는 성별/학년 별로 학생의 수가 저장된 배열값에서 k로 나눈 몫+나머지 입니다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
using namespace std;
int stu[2][6];
int main()
{
    int n, k, s, y, cnt = 0;
    cin >> n >> k;
    for (int i = 0; i < n; i++)
    {
        cin >> s >> y;
        stu[s][y - 1]++;
    }
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 6; j++)
        {
            //나눈 몫= 방의개수
            cnt += stu[i][j] / k;
            //나머지있을시 방의개수+1
            if (stu[i][j] % k != 0)
                cnt++;
        }
    }
    cout << cnt << endl;
}
cs


결과












문제출처: https://www.acmicpc.net/problem/14647


풀이

빙고판에서 9의 총 갯수에서 9가 가장많이 나오는 행과 열  중 9가 더 많이등장한 행or열의 값을 뺀 값이 정답입니다.

값은 행/열 배열값을 의미하고, 각각의 행or열에서 등장하는 9의 갯수가 담겨져있습니다.

이것을 그대로 소스코드로 구현하면 됩니다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
using namespace std;
int max_val;
int arr[500][500];
int row[500], col[500];
int sum;
int func(int num);
int main()
{
    cin.tie(0);
    cin.sync_with_stdio(false);
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> arr[i][j];
            row[i] += func(arr[i][j]);
            col[j] += func(arr[i][j]);
            sum += func(arr[i][j]);
        }
    }
    //행에대해서 탐색 
    for (int i = 0; i < n; i++)
    {
        if (row[i] > max_val)max_val = row[i];
    }
    //열에대해서 탐색
    for (int j = 0; j < m; j++)
    {
        if (col[j] > max_val)max_val = col[j];
    }
    //전체 9의 갯수 값에서 행,열중 큰 값을 뺀값이 정답
    cout << sum - max_val <<endl;
}
int func(int num)
{
    int cnt = 0;
    while (num)
    {
        if (num % 10== 9)cnt++;
        num /= 10;
    }
    return cnt;
}
cs


결과


문제출처: https://www.acmicpc.net/problem/17224


풀이

문제가 길다보니 괜히 어렵게 접근하여 낚인 문제입니다.

pair벡터와 2번째 원소를기준으로 정렬하는 sort함수로 풀었는데 자꾸 100점이 뜨길래 계속 고민했지만 복잡하게 생각할 필요가 없는 문제였습니다.

벡터와 알고리즘 헤더를 이용하지않고도 1차원 배열하나만 있으면 간단하게 풀리는 문제입니다. 너무 어렵게 생각했나봅니다..

저처럼 pair벡터와 2번째 원소를 기준으로 정렬시켜서 계산한 분들이 계시다면 분명 문제에서 알려준대로 예시2,3번의 출력값이 나오지 않을 것입니다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int arr[101];
int main()
{
    int n, l, k, sub1, sub2, sum = 0;
    cin >> n >> l >> k;
    for (int i = 0; i < n; i++)
    {
        cin >> sub1 >> sub2;
        if (sub2 <= l)
            arr[i] = 140;
        else if (sub1 <= l)
            arr[i] = 100;
    }
    sort(arr, arr + n, greater<int>());
    for (int i = 0; i < k; i++)
    {
        sum += arr[i];
    }
    cout << sum << endl;
    
}
cs


결과








문제출처: https://www.acmicpc.net/problem/15953


풀이

그냥 조건대로 코딩하면 됩니다.

정답률이 36프로라니....


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
using namespace std;
int main()
{
    int t, a, b, sum; cin >> t;
    for (int i = 0; i < t; i++)
    {
        sum = 0;
        cin >> a >> b;
        if (a == 1)
            sum += 5000000;
        else if (a == 2 || a == 3)
            sum += 3000000;
        else if (a >= 4 && a <= 6)
            sum += 2000000;
        else if (a >= 7 && a <= 10)
            sum += 500000;
        else if (a >= 11 && a <= 15)
            sum += 300000;
        else if (a >= 16 && a <= 21)
            sum += 100000;
 
        if (b == 1)
            sum += 5120000;
        else if (b == 2 || b == 3)
            sum += 2560000;
        else if (b >= 4 && b <= 7)
            sum += 1280000;
        else if (b >= 8 && b <= 15)
            sum += 640000;
        else if (b >= 16 && b <= 31)
            sum += 320000;
        cout << sum << '\n';
    }
}
cs


결과



문제 출처: https://www.acmicpc.net/problem/1018


풀이

규칙을 찾아서 풀어도되지만 8*8 체스판을 검정색,흰색이 각각 먼저 나오는 두 가지 버전으로 그려놓고 하나씩 비교하며 풀었습니다.


주의할점 :

1. 최소값이 매번 갱신되어야하므로 min_val 변수선언하여 비교 

2. black_change,white_change도 매번 갱신되므로 전역변수가 아닌 지역변수로 선언

3. string이 아닌 c언어로 풀 때 인덱스 조심(50 X  51부터)

4. 체스판을 검색하는 함수(black,white)에서 인덱스 [i-y][j-x]가 탐색을 시작한 좌표와 그려놓은 체스판의 첫번째 요소부터 같이 움직이는것을 알기


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include<iostream>
#include<algorithm>
using namespace std;
int n, m;
char map[55][55];
int min_val = 2000;
 
const char b[8][9= {
    {"BWBWBWBW"},
{"WBWBWBWB"},
{"BWBWBWBW"},
{"WBWBWBWB"},
{"BWBWBWBW"},
{"WBWBWBWB"},
{"BWBWBWBW"},
{"WBWBWBWB"}
};
const char w[8][9= {
{"WBWBWBWB"},
{"BWBWBWBW"},
{"WBWBWBWB"},
{"BWBWBWBW"},
{"WBWBWBWB"},
{"BWBWBWBW"},
{"WBWBWBWB"},
{"BWBWBWBW"}
};
int black(int y, int x);
int white(int y, int x);
int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        cin >> map[i];
    
    for (int i = 0; i < n - 7; i++)
    {
        for (int j = 0; j < m - 7; j++)
        {
            min_val = min(min(min_val,white(i, j)),black(i,j));
        }
    }
    cout << min_val << endl;
}
int black(int y, int x)
{
    int black_change = 0;
    for (int i = y; i < y + 8; i++)
    {
        for (int j = x; j < x + 8; j++)
        {
            if (map[i][j] != b[i-y][j-x])
                black_change++;
        }
    }
    return black_change;
}
int white(int y, int x)
{
    int white_change = 0;
    for (int i = y; i < y + 8; i++)
    {
        for (int j = x; j < x + 8; j++)
        {
            if (map[i][j] != w[i - y][j - x])
                white_change++;
        }
    }
    return white_change;
}
cs


결과


문제출처: https://www.acmicpc.net/problem/5533


풀이

구현력이 코딩테스트에서 제일중요한데 이런문제를 오래고민하고있는 제가 너무답답하네요 ㅠㅠ 평소에 이런 구현 연습 많이 하세요..

생각이 코딩으로 이어지는게 참 어려운것같네요.


오래 고민한만큼 상세하게 주석을 달아놨습니다. 설명은 이거로 대체할게요~


코드

#include<iostream>
using namespace std;
int card[200][3];
int score[200];
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> card[i][0] >> card[i][1] >> card[i][2];

	//총 3명이 연산하므로 
	for (int i = 0; i < 3; i++)
	{
		//3명이 각 점수에대해 n명과 비교
		//비교는 한명씩 탐색한다(버블정렬처럼)
		//총 3*n*n번 연산하게됨
		//j가 각 인원의 번호가됨.
		for (int j = 0; j < n; j++)
		{
			//현재 card[j][i]값과 같은게 있는지확인위해 check선언
			bool check_same = false;
			for (int k = 0; k < n; k++)
			{
				//본인은 비교에서 빼자(같은값이 있게되므로)
				if (j == k)continue;
				//같은값이있으면 탈출, 33행 안하므로 0값가짐
				if (card[j][i] == card[k][i])
				{
					check_same = true;
					break;
				}
			}
			//같지않다면 더해줌
			if (!check_same)
				score[j] += card[j][i];
		}
	}
	for (int i = 0; i < n; i++)
		cout << score[i] << endl;
}


결과


문제출처: https://www.acmicpc.net/problem/9517


풀이

dfs,bfs문제만 풀다가 머리도 식힐겸 시뮬레이션 문제를 풀어봤습니다.

각 사람의 시간과, 질문 대답여부를 pair로 받고 질문의 갯수동안 폭탄넘기기를 실행합니다. 주의할것은 8번까지왔는데 폭탄이 안터졌다면 1번으로 다시 가야하므로 이것만 조심하면됩니다.


코드

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int k, n;
	//페어로 받자
	pair<int, char>p;
	cin >> k >> n;
	int sum = 0;
	for (int i = 0; i < n; i++)
	{
		cin >> p.first >> p.second;
		//sum>=210일때 탈출
		sum += p.first;
		if (sum >= 210)
			break;
		//질문답했다면 폭탄넘김
		if (p.second == 'T')
			k++;
		if (k > 8)
			k %= 8;
			
	}
	cout << k << endl;
	
}


결과

'문제풀이(BOJ) > 시뮬레이션(구현)' 카테고리의 다른 글

[백준 1018] 체스판 다시 칠하기  (0) 2020.02.07
[백준 5533] 유니크  (0) 2020.01.19
[백준 5567] 결혼식  (0) 2020.01.15
[백준 1120] 문자열  (0) 2020.01.09
[백준 2526] 싸이클  (0) 2020.01.09

문제출처: https://www.acmicpc.net/problem/5567


그래프구현문제입니다.


풀이

보기의 예제를 보면, 1과 연결되있는 노드중에서 그 노드와 연결되어있는 노드의 개수를 찾는 문제입니다.

사실 이것만 구현하면 끝입니다....설명은 소스코드로..


코드

#include<iostream>
using namespace std;
int map[501][501];
int check[501];
int n, m,a,b, cnt;
int main()
{
	cin >> n >> m;
	for (int i = 0; i < m; i++)
	{
		cin >> a >> b;
		map[a][b] = 1;
		map[b][a] = 1;
	}
	for (int i = 2; i <= n; i++)
	{
		//만약 1과연결되있으면
		if (map[1][i])
		{
			//방문처리
			check[i] = 1;
			for (int j = 2; j <= n; j++)
			{
				//그 노드에서 연결된 노드를 방문처리
				if (map[i][j] == 1)
					check[j] = 1;
			}
		}
	}
	for (int i = 2; i <= n; i++)
	{
		//1되어있는 노드=1과연결되있는 노드와 연결되어있는 노드 수
		if (check[i] == 1)
			cnt++;
	}
	cout << cnt << endl;
}


결과

'문제풀이(BOJ) > 시뮬레이션(구현)' 카테고리의 다른 글

[백준 5533] 유니크  (0) 2020.01.19
[백준 9517] 아이 러브 크로아티아  (0) 2020.01.19
[백준 1120] 문자열  (0) 2020.01.09
[백준 2526] 싸이클  (0) 2020.01.09
[백준 11507] 카드셋트  (0) 2020.01.08

+ Recent posts