KoreanFoodie's Study

SW 역량테스트 - [모의 SW 역량테스트] 활주로 건설 문제 풀이/해답/코드 (C++ / JAVA) 본문

Data Structures, Algorithm/SW 역량테스트

SW 역량테스트 - [모의 SW 역량테스트] 활주로 건설 문제 풀이/해답/코드 (C++ / JAVA)

GoldGiver 2020. 9. 29. 11:41


SW 역량 테스트 준비를 위한 핵심 문제들을 다룹니다!

해답을 보기 전에 문제를 풀어보시거나, 설계를 하고 오시는 것을 추천드립니다. 

코드에 대한 설명은 주석을 참고해 주세요 :)

 


문제 링크 : swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeW7FakkUDFAVH

해답 코드 : 

 

#include <iostream>
#include <vector>
#include <math.h>

using namespace std;

int N, X;
int map[20][20];

int num_road;

bool isRange(int x) {
	if (x < 0 || x >= N) {
		return false;
	}
	else return true;
}


// change x-y coordinates to reuse build function
void shuffle() {

	int temp;

	for (int i = 0; i < N; i++) {

		for (int j = i+1; j < N; j++) {

			temp = map[i][j];
			map[i][j] = map[j][i];
			map[j][i] = temp;
		}
	}

}


void build() {

	// first, check row

	int series;
	int height;

	// to check if there is already a slope
	 
	for (int i = 0; i < N; i++) {
		
		
		int temp = num_road;
		series = 1;
		height = map[i][0];

		bool isRoad = true;


		for (int j = 1; j < N; j++) {

			if (map[i][j] == height) {
				series++;
				continue;

			} else {

				// if going up
				if (height - map[i][j] == -1) {
					if (series >= X) {
						series = 1;
						height = map[i][j];
						continue;
					}
					else {
						isRoad = false;
						break;
					}

				} // if going down
				else if (height - map[i][j] == 1) {
					series = 1;
					height = map[i][j];
					for (int k = j; k < N-1; k++) {
						if (map[i][k] == map[i][k + 1]) {
							series++;
						} else { break; }
					} // build a slope
					if (series >= X) {
						series = -1 * X + 1;
						continue;
					}
					else {
						isRoad = false;
						break;
					}
				} // height difference is lager than 1
				else if (abs(height - map[i][j]) > 1){
					isRoad = false;
					break;
				}
			}
		}

		if (isRoad) num_road++;

	}


}


int main(int argc, char** argv)
{
	int test_case;
	int T;
	/*
	   아래의 freopen 함수는 input.txt 를 read only 형식으로 연 후,
	   앞으로 표준 입력(키보드) 대신 input.txt 파일로부터 읽어오겠다는 의미의 코드입니다.
	   //여러분이 작성한 코드를 테스트 할 때, 편의를 위해서 input.txt에 입력을 저장한 후,
	   freopen 함수를 이용하면 이후 cin 을 수행할 때 표준 입력 대신 파일로부터 입력을 받아올 수 있습니다.
	   따라서 테스트를 수행할 때에는 아래 주석을 지우고 이 함수를 사용하셔도 좋습니다.
	   freopen 함수를 사용하기 위해서는 #include <cstdio>, 혹은 #include <stdio.h> 가 필요합니다.
	   단, 채점을 위해 코드를 제출하실 때에는 반드시 freopen 함수를 지우거나 주석 처리 하셔야 합니다.
	*/
	//FILE *fp;
	//freopen_s(&fp, "sample_input.txt", "r", stdin);
	cin >> T;
	/*
	   여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
	*/
	for (test_case = 1; test_case <= T; ++test_case)
	{
		cin >> N >> X;
		/*
		if (test_case == 6) {
			num_road = test_case;
		}
		*/
		num_road = 0;

		for (int i = 0; i < N; i ++) {
			for (int j = 0; j < N; j++) {
				cin >> map[i][j];
			}
		}

		build();
		shuffle();
		build();
		
		std::cout << "#" << test_case << " " << num_road << "\n";

	}
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}

 

SW 역량테스트 준비 - [모의 SW 역량테스트] 풀이 / 코드 / 답안 (C++ / JAVA)

SW 역량테스트 준비 - C++ 코드, Java 코드

SW 역량테스트 준비 - 백준 알고리즘 문제

 
Comments