'프로그래밍' 태그의 글 목록 (3 Page) :: 잡다한 프로그래밍
반응형

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 해결방법

dfs를 사용하여 방문여부를 체크하고, 더불어 array의 값이 3일때를 체크하는 방식을 사용하였다.

방문여부를 체크할 bool array가 dfs재귀함수 호출전에 체크해줘야한다는 주의사항이 있다.


2. 코드

#include <string.h>
#include <iostream>
using namespace std;
int num = 0;
int ary[16][16];
int bo[16][16] = { 0 };
int result = 0;
int dx[4] = { -1, 1 ,0, 0 };
int dy[4] = { 0, 0, -1, 1 };

void dfs(int x, int y) {
    bo[1][1] = 1;
	if (ary[x][y] == 3) {
		result = 1;
	}
	else {
		for (int i = 0; i < 4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			if (nx < 1 || ny < 1 || nx >= 14 || ny >= 14 || ary[nx][ny] == 1 || bo[nx][ny]){
                continue;
            }
			else{
                                bo[nx][ny] = 1;
                dfs(nx, ny);
            }
        }
	}
}
int main()
{
	for (int i = 0; i < 10; i++) {
		scanf("%d", &num);
		memset(bo, 0, sizeof(bo));
		for (int m = 0; m < 16; m++) {
			for (int n = 0; n < 16; n++) {
				scanf("%1d", &ary[m][n]);
			}
		}
		result = 0;
		dfs(1, 1);

		cout << "#" << num << " " << result << endl;
	}
}
반응형
반응형

1. 시리얼 통신이란?

  • 시리얼(RS232) 통신은 주로 IBM 호환 PC에서 쓰이는 시리얼 통신 방법
  • 예전에는 주로 모뎀 연결에 RS232 통신을 사용했다
  • 최장 1.5m 정도 까지 통신 가능
  • 최근의 노트북 PC는 무게, 두께를 줄이기 위해 시리얼 포트를 제거하고 USB를 사용함
  • 아두이노 보드는 기본으로 제공하는 USB 포트를 이용하여 시리얼(RS232) 통신이 가능함

다음 사진과 같이 아두이노는 PC와 시리얼 통신을 하게 된다.

PC 아두이노간 시리얼 통신


2. 시리얼 통신 예제

아두이노 시리얼 모니터에서 1 or 2를 입력하면 13번 LED가 ON/OFF되는 프로그램 코딩

int led = 13;

void setup()
{
	pinMode(led, OUTPUT); //13번 LED를 아웃풋으로 설정
	digitalWrite(led, LOW);
	Serial.begin(9600); //보트레이트를 9600으로 설정 시리얼창과 아두이노의 설정이 같아야함
}
void loop()
{
	char read_data;
if (Serial.available())
{
	read_data = Serial.read();
	if( read_data == '1')
	{
		digitalWrite(led, HIGH); //LED ON
		Serial.println("LED ON");
	}
	else if( read_data == '2')
	{
		digitalWrite(led, LOW); //LED OFF
		Serial.println("LED OFF");
	}
		delay(10);
}
}

다음과 같이 코딩을 완료하였다면 아래와 같은 결과를 확인 할 수 있다.

결과 화면

반응형
반응형

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 해결방법

SW expert 해결했던 문제 중 가능한 시험 점수라는 포스팅에서 해결했던 방법을 사용하면 해결할 수 있을 거라 생각했다. 이는 정확한 해결방법이었다


2. 코드

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;

int total = 0;
int N = 0;
int K = 0;
int ary[20];
int temp[100000];
int sum = 0;

void check(){
    temp[0] = 1;
    sum = 0;
    
    for(int i = 0; i < N; i++){
     sum += ary[i];
        for(int j = sum; j>=0; j--){
            if(temp[j]){
                temp[j + ary[i]] += temp[j];
            }
        }
    }

}
int main()
{
    cin >> total;
    for(int i = 0; i < total; i++){
        memset(temp, 0, sizeof(temp));
        memset(ary, 0, sizeof(ary));      
        scanf("%d", &N);
        scanf("%d", &K);
        for(int j = 0; j < N; j++){
            scanf("%d", &ary[j]);
        }
        check();
        cout << "#" << i+1 << " " << temp[K] << endl;
    }
}

3. 주의사항

문제처럼 K의 범위를 1000으로 하면 런타임 에러가 발생하여 temp배열의 크기를 더 크게 설정해주었다

반응형
반응형

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 해결방법

dfs를 활용하여 정해진 회문의 횟수만큼 방문했을 시 회문값에 일치하면 result개수를 늘리는 방법으로 해결하였다.


2. 코드

#include <iostream>
#include <string>
using namespace std;

int line = 0;
char ary[8][8];
char buf[10] = {};
int result = 0;
int dx[4] = {-1 , 1 ,0 , 0};
int dy[4] = {0, 0, -1, 1};
void check(int x, int y, int dept, int val) {
    buf[dept] = ary[x][y];
	if (dept == line-1) {
		string temp;
		string temp2;
		for (int i = 0; i < line; i++) {
			temp = temp + buf[i];
		}
		for (int i = line-1; i >= 0; i--) {
			temp2 = temp2 + buf[i];
		}
		if (temp.compare(temp2) == 0) result++;
	}
	else {
		int nx = x + dx[val];
		int ny = y + dy[val];

		if (nx < 0 || ny < 0 || nx >= 8 || ny >= 8)  return;
		else {
			check(nx, ny, dept + 1, val);
		}
	}
}

int main()
{
	for (int k = 1; k <= 10; k++) {
		cin >> line;
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				cin >> ary[i][j];
			}
		}
		result = 0;
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				for (int k = 0; k < 4; k++) {
					check(i, j, 0, k);
				}
			}
		}


		cout << "#" << k << " " << result / 2 << endl;
	}
	

}

3. 주의사항

dfs를 반복하면서 1번부터 4번까지 1,2,3,4 와 4번부터 1번까지 4,3,2,1을 두번 체크하기 때문에 결과값을 2로 나눠주면 올바른 결과 값이 나온다

반응형
반응형

https://swexpertacademy.com/main/main.do

불러오는 중입니다...

1. 해결방법

먼저 N개를 2로 나눈 N/2의 몫을 P라 할 때 P가 처음 시작점이 될 것 이라고 생각했고, 첫번째 행부터 P번째 행까지는 -1, +1열까지 N부터 P번째 행까지는 +1 해가는 방식으로 2가지의 개수를 합치고 더해서 총 개수를 구하는 방식을 이용했다.


2. 코드

#include <iostream>

using namespace std;
int total;
int num;
int ary[49][49];
int sum = 0;
void check() {
	int center = num / 2;
	sum = 0;
	for (int i = 0; i < center; i++) {
		for (int j = center-i; j <= center+i; j++) {
			sum += ary[i][j];
		}
        for(int k = center - i; k <= center + i; k++){
            sum += ary[num-1-i][k];
        }
	}
            for(int m = 0; m<num; m++){
         	sum += ary[center][m];   
        }
}
int main()
{
    int temp = 0;
	cin >> total;
	for (int i = 0; i < total; i++) {
		cin >> num;
		for (int j = 0; j < num; j++) {
			for (int k = 0; k < num; k++) {
				scanf("%1d", &ary[j][k]);
			}
		}
		check();
		cout << "#" << i + 1 << " " << sum << endl;
	}
}

 

반응형
반응형

 

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


1. 해결방법

정해진 횟수만큼 최대값은 -1 최소값은 +1 반복문을 돌리면서 최대값과 최소값의 차이가 1 이하이면 리턴하게 하는 방법이 가장 적절하다고 생각했다. 예외가 하나도 발생하지 않아서 생각보다 쉬운 문제였다.


2. 코드

#include <iostream>
#include <algorithm>
int total;
int ary[100];
int result;

using namespace std;

void check() {
	int n = 0;
	while (n < total) {
		int max = *max_element(ary, ary + 100);
		int min = *min_element(ary, ary + 100);
		if (max - min <= 1) {
			break;
		}
		else {
			int maxindex = distance(ary, max_element(ary, ary + 100));
			int minindex = distance(ary, min_element(ary, ary + 100));
			ary[maxindex] = ary[maxindex] - 1;
			ary[minindex] = ary[minindex] + 1;
		}

		n++;
	}
}

int main()
{
	for (int i = 0; i < 10; i++) {
		cin >> total;
		for (int j = 0; j < 100; j++) {
			cin >> ary[j];
		}
		check();
		result = *max_element(ary, ary + 100) - *min_element(ary, ary + 100);
		cout << "#" << i + 1 << " " << result << endl;
	}
}
반응형
반응형

1. 프레임 워크란?

SW의 구조와 클래스를 제공한다.


2. 라이브러리와 프레임워크의 차이

라이브러리 : 클래스의 집합으로 다른 개발자가 만들어놓은 함수라고 생각하면 좋다. 사용자는 이 라이브러리를 가져다 사용한다.

 

프레임워크 : 프레임워크에서 기본 골격을 잡아놓고 프레임워크의 제어 흐름에 맞게 코드를 작성하여 사용한다. 라이브러리와 다르게 프레임워크에서 사용자의 코드를 호출한다고 생각하면 좋다.


3. 스프링이란?

POJO기반의 엔터프라이즈 애플리케이션 개발을 쉽고 편하게 해주는 프레임워크

자바 애플리케이션을 개발하는데 필요한 구조를 제공하는 프레임워크로, 스프링의 전체적인 구조를 처리하므로 개발자는 애플리케이션 개발에 집중할 수 있다는 장점이 있다.

반응형
반응형

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 해결방법

처음에는 for문을 이용해서 횟수만큼 가장 0번째값과 가장 큰 값을 교환, 이후 1번째 값과 가장 큰 값을 교환 .... 하는 방식으로 해결하려 했으나 배열의 수보다 회전의 수가 많아지거나 같은 자리가 교환 되어버리는 문제가 생겼다 따라서 dfs를 사용하여 모든 경우의 수를 비교하는 방법으로 해결하였다.


2. 코드

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
using namespace std;

int total;
int num = 0;
string tmp;
int result;
void dfs(int x, int dept) {
	if (dept == num) {
		if (result < stoi(tmp)) {
			result = stoi(tmp);
		}
		return;
	}
	else {
		for (int i = x; i < tmp.size(); i++) {
			for (int j = i; j < tmp.size(); j++) {
				if (i == j) continue;
				if (tmp[i] <= tmp[j]) {
					swap(tmp[i], tmp[j]);
					dfs(i, dept + 1);
					swap(tmp[i], tmp[j]);
				}
			}
		}
	}
}
int main()
{
	cin >> total;
	for (int i = 0; i < total; i++) {
		result = 0;
		cin>> tmp;
		scanf("%d", &num);
		result = stoi(tmp);
		dfs(0, 0);
		printf("#%d %d\n", i + 1, result);
	}
}

3. 주의사항

같은 자리가 서로 바뀌는 것을 방지하기 위해 if (i == j) continue; 부분이 꼭 필요하다.

반응형

+ Recent posts