[백준 BOJ] 14467번 소가 길을 건너간 이유 1 (C++/cpp)

2022. 11. 1. 14:29PS (Program Solving)/BOJ (백준)

문제 설명

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

 

14467번: 소가 길을 건너간 이유 1

3번 소는 위치 1, 0, 1에서 관찰되었으므로 길을 최소 두 번 건넜음을 확인할 수 있다. 4번 소도 길을 한 번 건넜으며, 나머지 소는 길을 건넌 기록이 확인되지 않는다.

www.acmicpc.net

백준 BOJ 14467번 소가 길을 건너간 이유 1 문제 사진

 

접근 방법 - 배열을 이용한 연산 문제

백준의 14467번 문제는 배열의 원리를 이용하여 해결할 수 있는 문제이다.

해당 문제는, 입력으로 주어지는 소의 번호와 위치를 통해 소들이 길을 건넌 총 횟수를 구하여 출력해야 하는 문제이다.

단순 구현 문제라 다양한 방법이 있겠지만, 필자의 경우엔 배열을 이용해서 길을 건넜는지에 대한 여부를 살폈다.

이때, 배열의 인덱스는 소의 번호이며 배열값은 각 소의 위치를 나타낸다는 가정 하에 코드를 작성하였다.

혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면, 아래의 설명과 코드를 참고해보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 관찰 횟수(n)를 입력받는다.

 

2) 각 소의 위치를 배열값으로 갖는 배열(arr)을 선언하고, 모든 배열값을 -1로 초기화한다.

(0과 1은 소의 현재 위치를 나타내며, 관찰되지 않는 소의 위치는 알 수 없으므로 -1로 설정하였다.)

 

3) 길을 건넌 총 횟수를 나타내는 변수 num을 0으로 초기화하여 선언한다.

 

4) n의 크기만큼 반복문을 실행하여 아래의 연산을 취한다.
- 소의 번호(a)와 소의 현재 위치(b)를 입력받는다.

- 만일 이전에 관찰한 기록이 있는 소라면, 그 인덱스의 배열값을 확인해본다.

이 배열값이 입력받은 b의 값과 일치하지 않다면, 그 소는 한 번은 길을 건넌 것이다. 따라서 이 경우엔, num에 1을 더하도록 한다.

- 관찰 중인 소의 현재 위치를 b 값으로 갱신한다.

 

5) 연산이 완료되었다면, 최종적으로 저장된 num의 값을 출력한 뒤 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#define endl '\n'
using namespace std;

//백준 14467번 코드
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	int n;
	cin >> n;

	int arr[100];
	for (int i = 0; i < 100; i++) {
		arr[i] = -1;
	}

	int num = 0;
	for (int i = 0; i < n; i++) {
		int a, b;
		cin >> a >> b;
		if (arr[a - 1] == 0 || arr[a - 1] == 1) {
			if (arr[a - 1] != b) {
				num++;
			}
		}
		arr[a - 1] = b;
	}
	cout << num << endl;
}

 

제출 결과

백준 BOJ 14467번 소가 길을 건너간 이유 1 문제 C++ 제출 결과

(2022.05.14 백준 14467번 문제 제출 결과)

반응형