www.acmicpc.net/problem/2217

 

2217번: 로프

N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하

www.acmicpc.net

 

단순하게 생각했을때 쉽다고 생각되었다. N개의 로프중 최대중량이 가장 작은 로프가 항상 기준이 되어야한다

그렇지않으면 끊어지기 때문이다. 하지만

모든 로프를 사용해야할 필요는 없고, 임의로 몇 개의 로프를 골라서 사용해도 된다 라는 점을 생각해보았을때

1. N값을 입력받는다. N이 5이라면

2. 10, 15, 1, 18, 20 순으로 들어왔다고 치자

3. 모든 로프를 사용할 경우 1을 기준으로 5개의 로프는 5중량을 버틸 수 있다.

4. 위의 케이스는 극단적이지만 이 문제의 맹점이라고 생각한다. 이때 로프 1이 끼게 됨으로써 최대중량이 줄어들게된다 이 것을 구현하기 위해서는 내림차순으로 정렬을 한 후에 반복문을 통해 구할 수 있을거라 생각하고 구현해보겠습니당.net/problem/2217

 

2217번: 로프

 

N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하

 

www.acmicpc.net

 

 

단순하게 생각했을때 쉽다고 생각되었다. N개의 로프중 최대중량이 가장 작은 로프가 항상 기준이 되어야한다

 

그렇지않으면 끊어지기 때문이다. 하지만

 

모든 로프를 사용해야할 필요는 없고, 임의로 몇 개의 로프를 골라서 사용해도 된다 라는 점을 생각해보았을때

 

1. N값을 입력받는다. N이 5이라면

 

2. 10, 15, 1, 18, 20 순으로 들어왔다고 치자

 

3. 모든 로프를 사용할 경우 1을 기준으로 5개의 로프는 5중량을 버틸 수 있다.

 

4. 위의 케이스는 극단적이지만 이 문제의 맹점이라고 생각한다. 이때 로프 1이 끼게 됨으로써 최대중량이 줄어들게된다 이 것을 구현하기 위해서는 내림차순으로 정렬을 한 후에 반복문을 통해 구할 수 있을거라 생각하고 구현해보겠습니당

 

package test;

import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class test {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		
		Integer[] rope = new Integer[n];
		//로프의 중량을 담을 배열
		
		for(int i=0;i<5;i++) {
			rope[i]=sc.nextInt();
			//중량 입력
		}
		
		Arrays.sort(rope,Collections.reverseOrder());
		//내림차순 정렬
		int[] wei = new int[n];
		//최대중량을 담을 배열 선언
		int result = 0;
		//최대중량을 담을 변수
		
		for(int i=0;;i++) {
			
			if(i==0) {
				wei[i] = rope[i]; 
				//첫번째 바퀴때는 최대중량이 곧 로프의 최대중량이된다.
			}
			else {
				//두번째 바퀴부터
				if(wei[i-1] >  (rope[i]+rope[i+1])/(i+2)) {
					//만약 현재 최대중량보다 최대중량이 작다면
					result = wei[i-1];
					//result 변수에 현재 최대중량값을 저장한다.
					break;
				}
				else {
				wei[i] = (rope[i]+rope[i+1])/(i+2);
				//그렇지 않다면 최대중량을 저장한다.
			}
		}
		}
		System.out.println(result);

	}
}

 

 

단지 생각대로 적은 코드지만 돌아가지도 않고 뭔가 놓치고 있다 for에 else절이 이상한것 같다 다른 사람이 쓴 코드를 보며 내가 뭘 잘못했을까... 생각해봐야겟다

 

저녁밥을 먹으며 생각해보았다.

package test;

import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class test {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		
		Integer[] rope = new Integer[n];
		//로프의 중량을 담을 배열
		
		for(int i=0;i<n;i++) {
			rope[i]=sc.nextInt();
			//중량 입력
		}
		
		Arrays.sort(rope,Collections.reverseOrder());
		//내림차순 정렬
		int max = 0;
		for(int i =0; i<n;i++) {
			if(max < rope[i] * (i+1)) {
				max =  rope[i] * (i+1);
			}
		}
		System.out.println(max);
}
}

 

 

차근차근 생각해보니 쉬운문제였다 

다른사람들의 코드는 오름차순으로 하는코드들을 봤는데 

내림차순으로 정렬하는것이 미세하게나마 빠르다고 생각한다. 최대값을 구하는 것이기때문에

최대값을 찾은 후 뒤에나오는 값들은 무조건 최대값이 아니기때문에 계산할 필요가 없어진다.

www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

이 문제를 풀기위해 생각을 해보자 뭔가 처음보는 듯한 유형이다.

일차원적인 생각은 최소로 만들기위해서는 -뒤에 절대값이 최대한 크게 괄호로 묶어주면 될 것이라고 생각된다.

package test;

import java.util.Scanner;

public class test {

	public static void main(String[] args) {
		int sum = Integer.MAX_VALUE;
		Scanner sc =new Scanner(System.in);
		String[] n = sc.next().split("-");
		
		for(int i=0;i<n.length;i++) {
			int tmp = 0;
			
			String[] add = n[i].split("\\+");
			
			for(int j = 0; j < add.length; j++) {
				tmp += Integer.parseInt(add[j]);
			}
			
			if(sum == Integer.MAX_VALUE) {
				sum = tmp;
			}
			else {
				sum -= tmp;
			}
		}
		System.out.println(sum);
	}
}

 

어떻게 해야할지 감이 안잡혀 다른 사람들이 짠 코드를 참고하였다.

문자열에서 -가 나오고 다음 -가 나오기전까지의 +들은 -로 바뀐다 결국 -가 나오는 시점부터 뒤는 쭉 -값이다.

신박한 문제였다 나름 재미있었고 이런 문제가 다시 나온다면 혼자만의 힘으로 풀어봐야겠다.

'알고리즘 with 자바 > 그리디' 카테고리의 다른 글

백준 10162 : 전자레인지 - JAVA  (0) 2021.03.17
백준 2217 : 로프 - JAVA  (0) 2021.03.17
백준 5585 : 거스름돈 - JAVA  (0) 2021.03.16
백준 11047 : 동전 0 - JAVA  (0) 2021.02.16
백준 11399 : ATM - JAVA  (0) 2021.02.16

 

www.acmicpc.net/problem/5585

 

5585번: 거스름돈

타로는 자주 JOI잡화점에서 물건을 산다. JOI잡화점에는 잔돈으로 500엔, 100엔, 50엔, 10엔, 5엔, 1엔이 충분히 있고, 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 타로가 JOI잡화점에서 물건을 사

www.acmicpc.net

 

이 문제를 위한 나의 해결법은

1. 500엔으로 나눈 몫 나머지를 구하고

2. 500엔으로 나눈 나머지를 100엔으로 위와 마찬가지로 구한다.

10엔 5엔 도 마찬가지로 구하고 1엔때의 몫을 구한다.

 

package test;

import java.util.Scanner;

public class test {

	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int n = sc.nextInt();
		
		int coin[] = {500,100,50,10,5,1};
		int sum =0;
		int nam =1000-n;
		
		for(int i =0;i<6;i++) {
			sum += nam/coin[i];
			if(n%coin[i]!=0) {
				nam = nam%coin[i];
			}
			else {
				break;
			}
		}
		System.out.println(sum);
	}
}

 

이 문제를 보고 일단 coin 배열에 동전에 유형들을 넣고

for문을 이용하여 최대한 짧게 구현하였다. 문제를 잘못이해하여 1000엔을 주고 나머지를 구해야하는데 입력값 그대로를 나눠버려서 살짝 착오가 생겼지만 문제를 다시한번 읽어보니 nam값을 1000에서 초기값을 빼서 계산했다!

 

그랬더니 정답!!

다른사람들이 짠 코드를 보며 나와다른점이 무엇일까 생각해보기로했다!

'알고리즘 with 자바 > 그리디' 카테고리의 다른 글

백준 2217 : 로프 - JAVA  (0) 2021.03.17
백준 1541 : 잃어버린 괄호 - JAVA  (0) 2021.03.16
백준 11047 : 동전 0 - JAVA  (0) 2021.02.16
백준 11399 : ATM - JAVA  (0) 2021.02.16
백준 2839 : 설탕배달 - JAVA  (0) 2021.02.16

가답안기준 평균 95점으로 합격!!!!! 

 

책 배송오는대로 실기합격까지 달려보자

'자격증 > 정보처리기사' 카테고리의 다른 글

최종 합격!!!  (0) 2021.06.10
정보처리기사 37일차  (0) 2021.02.19
정보처리기사 36일차  (0) 2021.02.18
정보처리기사 35일차  (0) 2021.02.13
정보처리기사 34일차  (0) 2021.02.12

5. 정보시스템 구축 관리

 5.3 소프트웨어 개발 보안 구축

  5.3.1 소프트웨어 개발 보안 구축 능력 단위 정의

  5.3.2 SW개발 보안 설계

 


- SW개발 보안 구축 능력 단위 정의

SW개발 보안 구축이란 정의된 보안 요구사항에 따라 SW의 보안 요구사항을 명세하고 이에 따라SW에 대한 보안을 설계, 구현, 테스트하는 능력이다.

 

- SW개발 보안 설계

 

1 Secure SDLC

 

1.1 Secure SDLC

SW개발과정에서 개발자의 실수, 논리적 오류 등으로 인해 발생될 수 있는 보안 취약점, 보안약점들을 최소하하여 사이버 보안위협에 대응할 수 있는 안전한 SW를 개발하기 위한 일련의 보안활동을 의미한다.

목적은 각 단계별로 요구되는 보안활동을 수행함으로써 안전한 소프트웨어를 만들 수 있도록 한다.

 

1.2 소프트웨어 개발 보안 생명주기 

시큐어 코딩을 위한 개발방법론은 기존의 SW개발 생명주기에서 보안활동을 추가하는 것으로 기존의 SDLC는 폭포수 모델, 프로토 타입, 나선형 모델 등이 존재한다.

 

2. 소프트웨어 개발 보안 생명주기 방법론 유형

 

2.1 MS-SDL

MS에서 보안수준이 높은 안전한 소프트웨어를 개발하기 위해 자체수립한 SDL이다

방법론이 적용되기 전 버전보다 50% 이상 취약점 감소한다.

교육부터 대응까지 총 7단계로 구분

 

2.2 Seven Touchpoint

실무적으로 검증된 개발보안 방법론 중 하나로써 SW 보안의 모범 사례를 SDLC에 통합한 방법론이다.

7개의 보안강화 활동을 정의

 

2.3 CLASP

소프트웨어 개발 생명주기 초기단계에 보안강화를 목적으로 하는 정형화된 프로세스로써, 활동중심 역할기반의 프로세스로 구성된 집합체이다.

이미 운영중이 시스템에 적용하기 좋음

개념, 역할기반, 활동평가, 활동 구현, 취약성의 5가지 관점에 따라 개발보안 프로세스를 수행할 것을 제안

 

2.4 CWE

SW 보안약점은 7개의 큰 항목과 47개의 세부 항목으로 구분된다

 

1. 입력데이터검증 및 표현 : XSS, SQL삽입, 버퍼오버플로우 등

2. 보안기능 : 중요정보 평문저장, 하드코딩된 패스워드

3. 시간 및 상태 : Deadlock자원에 대한 경쟁조건, 세션고착

4. 에러처리 : 처리루틴 누착, 정보 노출

5. 코드품질 : 널 포인트 역참조, 부적절한 자원 해제

6. 캡슐화 : 디버거 코드, 시스템 데이터 정보

7. API악용 : DNS Lookup에 의존한 보안 결정

 

보안 약점은 SW결함의 한 종류로 보안취약점을 유발하는 원인이다.

보안 취약점은 해커가 시스템 접근 권한 획득 등 직접 이용할 수 있는 SW 상의 결함이다.

 

3. 입력데이터 검증 및 표현

프로그램 입력 값에 대한 부적절한 검증 등으로 인해 발생할 수 있는 보안약점

 

1.1 SQL삽입

데이터베이스와 연동된 웹 어플리케이션에서 입력된 데이터의 유효성 검증을 하지 않은 경우 발생

공격자가 입력 폼 및 URL 입력란에 SQL 문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 약점을 말함

 

1.2 크로스사이트스크립트

웹페이지에 악의적인 스크립트를 포함시켜 사용자측에서 실행되게 유도하여, 정보유출 등의 공격을 유발할 수 있는 취약점

 

1.3 크로스사이트 요청 위조(CSRF)

서버로 요청하는 쿼리를 임의로 조작하여 실행하게 하는 공격으로 피해자의 권한을 이용하여 공격도 가능

CSRF XSS 차이점

CSRF는 피해자의 권한을 이용하여 피해자가 조작된 패킷을 전송하여 이 결과로 공격자가 이득을 얻는 형태의 공격

XSS는 악성 스크립트가 실행되어 클라이언트를 공격하는 것이다.

 

1.4 위험한 형식 파일 업로드

서버측에서 실행될 수 있는 스크립트 파일이 업로드 가능하고, 이파일을 공격자가 웹을 통해 직접 실행시킬 수 있는 경우, 시스템 내부명령어를 실행하거나 외부와 연결하여 시스템을 제어할 수 있는 취약점으로 대표적으로 웹셸을 이용한 업로드 공격이 있다.

 

1.5 디렉토리 경로 조작

외부의 입력을 통하여 디렉토리 경로 문자열 생성이 필요한 경우, 외부입력값에 대해 경로 조작에 사용될 수 있는 문자를 필터링하지 않으면, 예상 밖의 접근 제한 영역에 대한 경로 문자열 구성이 가능해 시스템 정보누출, 서비스 장애 등을 유발 가능, 즉 , 경로 조작을 통해서 공격자가 허용되지 않은 권한을 획득하여 설정에 관계된 파일을 변경하거나 실행 시 킬 수 있다.

 

4. 보안기능

인증, 접근제어, 권한 관리 등을 적절하지 않게 구현시 발생할 수 있는 보안약점

 

4.1 사용자 중요정보 평문 저장

프로그램이 보안과 관련된 민감함 데이터를 평문으로 통신채널을 통해서 송/수신 할 경우, 통신채널 스니핑을 통해 인가되지 않은 사용자에게 민감한 데이터가 노출될 수 있음

 

4.2 하드코드로 되어있는 패스워드

프로그램 코드 내부에 하드코드로 되어 있는 패스워드를 포함하고, 이를 이용하여 내부 인증에 사용하거나 외부 컴포넌트와 통신을 하는 것은 위험하다 또한 코드 내부에 하드코드로 되어 있는 패스워드가 인증실패를 야기하는 경우, 시스템관리자가 그 실패의 원인을 탐지하는 것도 용이하지 않다.

 

5. 에러처리

불충분한 에러 처리로 중요정보가 에러정보에 포함되어 발생할 수 있는 보안약점

 

5.1 오류 메시지를 통한 정보노출

SW가 실행환경, 사용자, 관련데이터에 대한 민감한 정보를 포함하는 오류메시지를 보여줌으로써 공격자의 악성 행위를 도와줄 수 있다.

 

6. 세션통제

다른 세션간 데이터 공유금지, 세션 노출금지, 재로그인시 세션ID변경, 세션종료 처리 등 세션관리로 발생할 수 있는 보안약점

 

6.1 불충분한 세션관리

인증시 일정한 규칙이 존재하는 세션ID가 발급되거나 세션 타임아웃을 너무 길게 설정한 경우 공격자에 의해 사용자 권한이 도용될 수 있는 취약점이다.

'자격증 > 정보처리기사' 카테고리의 다른 글

최종 합격!!!  (0) 2021.06.10
정보처리기사 필기 합격!  (0) 2021.03.10
정보처리기사 36일차  (0) 2021.02.18
정보처리기사 35일차  (0) 2021.02.13
정보처리기사 34일차  (0) 2021.02.12

5. 정보시스템 구축 관리

 5.1.1 소프트웨어 개발 방법론 활용 능력 단위 정의

 5.1.2 소프트웨어 개발 방법론 선정


- 소프트웨어 개발 방법론 활용 능력 단위 정의

소프트웨어 개발 방법론 활용이란 응용소프트웨어 특성에 따라 정형화된 개발방법론을 선정하고, 프로젝트 특성에 맞도록 테일러링 하여 응용소프트웨어 개발에 활용하는 능력이다.

 

- 소프트웨어 개발 방법론 선정

 

1. 소프트웨어 개발 생명 주기 모델 

 

1.1 소프트웨어 개발 생명주기 정의

소프트웨어를 어떻게 개발할 것인가에 대한 추상적 표현으로 순차적 또는 병렬적 단계로 구성되며 개발 모델 또는 소프트웨어 공학 패러다임으로 정의한다.

SDLC는 타당성검토 -> 분석 -> 설계 -> 개발 -> 테스트 -> 운영 -> 유지보수 -> 폐기단계로 생명주기를 가진다.

 

1.2 소프트웨어 개발 생명주기 특징

개발 생명주기의 각 단계에 관련된 활동들이 정의되어 있음

단계별 활동들을 통해 다음 단계에 활용될 수 있는 산출물이 작성됨

전체 프로젝트의 비용 산정과 개발 계획을 수립할 수 있는 기본 골격제시

참여자들 간에 의사소통의 기준과 용어의 표준화를 가능하게 함

문서화가 충실한 프로젝트 관리를 가능하게 함

 

1.3 소프트웨어 개발 생명주기 모델의 유형

 

1. 폭포수 모델

정의 : 검토 승인을 거쳐 순차적 하향식으로 개발이 진행되는 생명주기 모델

장점 : 이해하기 쉬움

단점 : 요구도출 어려움

 

2. 프로토타입 모델

정의 : 핵심적인 기능을 먼저 만들어 평가한 후 구현하는 점진적 개발 방법

장점 : 요구사항 도출용이, 시스템 이해용이, 의사소통 향상

단점 : 사용자의 오해, 폐기되는 프로토타입 존재

 

3. 나선형 모델

정의 : 폭포수와 프로토타입 모델 장점에 위험분석을 추가한 모델

장점 : 점증적인 개발로 실패할 위험감소, 테스트 용이

단점 : 관리가 복잡

 

4. 반복 점증적 모델

정의 : 시스템을 여러번 나누어 Release 하는 방법

장점 : 위험의 조기 발견 및 최소화 전략 구현 가능

단점 : 관리 어려움

 

5. RAD

정의 : 짧은 개발주기 동안 소프트웨어를 개발하기 위한 순차적 프로세스 모델

장점 : 요구사항 이해와 범위의 명확한 설정 시 신속하고 완전한 기능 구현 가능

단점 : 기술적 위험 높을 경우 부적합, 적절한 모듈화 필수, 책임감 있는 구성원 필요

 

2. 소프트웨어 개발 방법론

소프트웨어 공학 원리를 소프트웨어 개발 생명주기에 적용한 개념으로 정보시스템 개발을 위한 작업 활동, 절차, 산출물, 기법 등을 체계적으로 정리한 것을 의미한다.

 

2.1 SW개발 방법론의 구성

SW개발방법론은 시스템의 종류, 프로세스, 조직, 사람, 문화에 따라 다르게 선정되어야 한다.

 

2.2 SW개발 방법론의 유형

1. 전통적인 개발 방식

정의 : 검토/승인을 거쳐 순차적 하향식으로 개발이 진행되는 생명주기 모델

장점 : 이해하기 쉬움, 다음단계 진행 전에 결과 검증, 관리용이

단점 : 요구도출 어려움, 설계/코딩/테스트 지연가능 , 문제발견 지연

 

2. Agile방법론

정의

절차보다는 사람이 중심이 되어 변화에 유연하고 신속하게 적응, 효율적인 개발, 주위 변화수용, 능동적으로 대응하는 개발 방법론

 

특징 

변화대응 : 계획준수 보다 환경 변화에 즉시 대응

동작소프트웨어 : 포괄적인 문서화, 정형적 프로세스를 지향

고객협력 : 계약협상 중심에서 탈피

개인과 상호작용 : 프로세스나 도구보다는 구성원간의 의사소통 중시

 

프로세스의 핵심활동

제품 Backlog를 일정 타임박스기간 동안 설계, 개발, 테스트를 수행, 구현된 소프트웨어를 고객에게 시연하며 이해하기 힘든 산출물이 아닌 경우 동작하는 소프트웨어에 의한 확인 수행을 통해 고객 요구사항을 조기에 명확히 하는 활동을 반복 수행한다.

 

3. 전통적인 소프트웨어 개발 방식과 Agile 개발 방식의 비교

전통적인 개발방식  : 엄격한 프로세스 기반 정형화된 역할 및 활동 강조

Agile 개발 방식 : 프로젝트 관계자간 상호 작용을 중심으로 반복적인 점검과 테스트

 

3. 소프트웨어와 시스템

 

3.1 소프트웨어

하드웨어를 동작 시켜 사용자가 작업을 편리하게 수행하도록 하는 프로그램과 자료구조를 의미하는 것으로 프로그램 개발, 운용, 유지보수 관련된 모든 문서와 정보를 포함한다.

 

소프트웨어 분류

기능에 의한 분류 : 시스템 소프트웨어, 응용 소프트웨어 

사용 분야에 의한 분류 : 프로그래밍, 문서, 통신, 분산처리, 멀티미디어, 개발 인공지능

개발 과정 성격에 따른 분류 : 프로토타입, 프로젝트 산출물, 패키지

정보처리 방법에 따른 분류 : 일괄처리, 온라인, 실시간

 

3.2 시스템

전체적으로는 통일된 하나의 개체를 형성하면서 각각의 고유기능을 수행하고 그들의 공통적 목표를 달성하기 위해 상호 작용하는 요소들의 집합이다.

시스템의 특성

구조적 측면

시스템은 입력 처리 출력의 구조를 갖는다.

시스템은 피드백 구조를 갖는다

시스템은 계층적 구조를 갖는다.

기능적 측면

시스템은 목표 지향적이다

시스템은 상승 작용적이다.

시스템은 자기 제어적이다.

 

4. 소프트웨어 공학

 

4.1 소프트웨어 위기

여러가지 원인에 의해 개발 속도가 하드웨어 개발속도를 따라가지 못해 소프트웨어에 대한 사용자들의 요구사항을 처리할 수 없는 문제가 발생함을 의미한다.

 

1. 소프트웨어 위기의 발생원인

소프트웨어 특징에 대한 이해 부족 : 논리적인 소프트웨어 특징을 이해하지 못함

소프트웨어 관리 부재 : 소프트웨어 관리를 소홀히 하여 효율적인 자원 통제가 이루어지지 못했음

프로그래밍에만 치중 : 소프트웨어 품질이나 유지보수는 고려하지 않고, 프로그램만 하려해서 다양하고 복잡해지는 소프트웨어의 요구사항을 처리하지 못함

 

2. 소프트웨어 문제점

개발 인력 부족과 그로 인한 인건비 상승

성능 및 신뢰성 부족

개발 기간 지연 및 개발 비용 증가

유지보수가 어려워져 비용 증가

소프트웨어의 생산성 저하

소프트웨어 품질 저하

 

4.2 소프트웨어 공학의 필요성

소프트웨어의 위기를 극복하기 위한 방안으로 연구된 학문으로 소프트웨어의 품질과 생산성 향상을 목적으로 한다.

소프트웨어 공학의 정의

IEEE 정의 : 소프트웨어의 개발 운용, 유지보수, 폐기 처분에 대한 체계적인 접근 방안

Fairly 정의 : 지정된 비용과 기간 내의 소프트웨어를 체계적으로 생산하고 유지보수 하는 데 관련된 기술적이고 관리적인 원리

Boehm 정의 : 과학적인 지식을 소프트웨어 설계와 제작에 응용하는 것이며 이를 개발 운용, 유지보수 하는데 필요한 문서 작성 과정

 

4.2 소프트웨어 공학의 기본 원칙

현대적인 프로그래밍 기술을 계속적으로 적용해야 한다.

개발된 소프트웨어 품질이 유지되도록 지속적으로 검증해야 한다.

소프트웨어 개발 관련 사항 및 결과에 대한 명확한 기록을 유지해야 한다.

'자격증 > 정보처리기사' 카테고리의 다른 글

정보처리기사 필기 합격!  (0) 2021.03.10
정보처리기사 37일차  (0) 2021.02.19
정보처리기사 35일차  (0) 2021.02.13
정보처리기사 34일차  (0) 2021.02.12
정보처리기사 33일차  (0) 2021.02.11

www.acmicpc.net/problem/11047

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

이 문제를 보고 나의 해결법은

 

1. n만큼의 배열을 생성한다.

2. for문을 통해 n만큼의 배열에 값을 집어넣는다.

3. for문을 통해 n번째 부터 시작하여 n값이 감소하며 몫이 0보다 커질때를 구한다.

4. 몫이 0보다 크다면 나눌 수 있는 제일 큰값이라는 소리이므로 그 값을 몫 변수에 저장한다.

5. 이때 나오는 나머지 값을 이중 폴문을 이용하여 같은 방법으로 찾았다.

 

여기까지 했을때 1번 입력에 대한 정답은 구했지만 2번 입력에 대한 정답을 구하지 못했다.

package test;

import java.util.Scanner;

public class test {

	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int n = sc.nextInt();
		int k = sc.nextInt();
		int m =0;
		//n[i]로 나눌때의 몫
		int m2 =0;
		// n[j]로 나눌때의 몫
		int na =0;
		// n[i]로 나눌때의 나머지
		
		int num[] = new int[n];
		
		for(int i =0;i <n;i++) {
			num[i] = sc.nextInt();
		}
		
		for(int i =n-1; i>=0; i--) {
			if((k/num[i])>0) {
				//처음 가장 큰 수로 나눠질때의 경우
				m = k/num[i];
				// 몫을 저장 동전의 수의 일부
				na = k%num[i];
				// 나머지값 저장
				
				for(int j=i;j>=0;j--) {
					//이때의 i값부터 다시 탐색
					if(na/num[j]>0) {
						//다음 가장 큰 수로 나눠질 경우
						m2 = na/num[j];
						// 두번째 몫을 저장 
						break;
					}
				}
				break;
			}
		}
		System.out.println(m+m2);
	}
}

 

뭔가 이상함을 느꼇다.. 10원의 경우도 있어야 한다는걸 늦게 깨달았다. 그렇다면 1의자리수까지 표현하려면?

뭔가 프로그램이 복잡해 질 것 같다는 생각이 들고 다시 한번 처음으로 돌아가 생각해보기로 하였다.

 

나의 부족함을 느끼게 해주는 문제였다... 왜이래 멍청하지..

이중 for문 마저 쓸필요가 없고

 

1. num[i]가 처음으로 같거나 작을때 나눈 몫 값을 저장한다. 

2. 이때 k 값은 나머지값으로 변환시킨다.

3. 반복문이 돌고 몫 값에 몫 + 다음번의 몫 값을 더해준다.

 

이런식으로하면 for문안에서 몇줄만으로 해결이 되는 문제라는걸 알게되었다.....

package test;

import java.util.Scanner;

public class test {

	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int n = sc.nextInt();
		int k = sc.nextInt();
		int m = 0;
		
		int num[] = new int[n];
		
		for(int i =0;i <n;i++) {
			num[i] = sc.nextInt();
		}
		
		for(int i = n-1;i>=0;i--) {
			if(num[i] <= k) {
				m += (k/num[i]);
				k = k%num[i];
			}
		}
		System.out.println(m);
	}
}

매일매일 공부하면 좀더 발전할거라 믿고 열심히 해야겠다.

 

'알고리즘 with 자바 > 그리디' 카테고리의 다른 글

백준 2217 : 로프 - JAVA  (0) 2021.03.17
백준 1541 : 잃어버린 괄호 - JAVA  (0) 2021.03.16
백준 5585 : 거스름돈 - JAVA  (0) 2021.03.16
백준 11399 : ATM - JAVA  (0) 2021.02.16
백준 2839 : 설탕배달 - JAVA  (0) 2021.02.16

www.acmicpc.net/problem/11399

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

설탕 배달 문제 보다는 쉬워보였다.

 

1. n을 입력받는다.

2. n만큼의 배열을 생성한다.

3. for문을 통해 배열의 값을 넣어준다.

4. 정렬 알고리즘을 이용해 최소가 되게끔 오름차순 정렬한다.

5. 여기서 코드를 어떻게 짜야할지 생각하는 도중 첫번째 값은 n만큼 더해지고 두번째 값은 n-1만큼 더해진다는 규칙을 찾았다!

 

package test;

import java.util.Scanner;

public class test {

	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int n = sc.nextInt();
		int time[] = new int[n];
		int tmp = 0;
		int nn = n;
		int sum =0;
		
		for(int i=0;i<n;i++) {
			time[i] = sc.nextInt();
		}
		sc.close();
		
		for(int i =0;i<n-1;i++) {
			for(int j =i+1; j<n;j++) {
				if(time[i]>time[j]) {
					tmp = time[i];
					time[i]=time[j];
					time[j]=tmp;
				}
			}
		}
		for(int i=0;i<n;i++) {
			sum += time[i]*nn;
			nn--;
		}
		System.out.println(sum);
	}
}

 

혼자만의 힘으로 짠 코드인데 일단 ...

정답을 맞추긴 했지만 구글링을통해 다른사람들의 코드를 보고 내 코드와 다른점이 무엇일까 궁금해졌다!

 

Array.sort() 를 쓰면 정렬을 해주는 라이브러리가 있었다.. 하지만 있다는 것만 알아두고 공부하는 단계에서는 쓰지 않는 것이 좋다고 생각된다! 프로그래밍 적 사고를 많이 해야 실력에 도움이 될것같기 때문..

 

 

www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

처음 이문제를 보고 

 

1. N값을 5로 나눈값을 몫변수에 저장한다.

2. N값을 5로 나눈 나머지값은 나머지변수에 저장한다.

3. 나머지값을 3으로 나눈 값을 변수에 저장하고

4. 5로 나눈 몫변수와 나머지값을 3으로 나눈 값의 합을 저장한다.

5. 만약 5로 나눈 나머지변수가 3의 배수가 아니라면 -1을 출력한다.

6. 그렇지 않다면 5로나눈 몫변수와 나머지값을 3으로 나눈 값의 합을 출력한다.

 

package test;

import java.util.Scanner;

public class test {

	public static void main(String[] args) {
		System.out.println("몇 킬로 필요한가여 ? ");
		Scanner scanner =new Scanner(System.in);
		int n = scanner.nextInt();
		
		int five_quotient = n/5;
		int five_Remainder = n%5;
		int three_num = five_Remainder/3;
		
		int finaln = five_quotient+three_num;
		
		if(!(five_quotient%3==0)) {
			System.out.println("-1");
		}
		
		else {
			System.out.println(finaln);
		}
		
		
	}
}

내 생각에는 이렇게 하면 될줄 알았지만 N의 값이 3의배수일때 오류가 발생한다...

 

6을 입력했을때 바로 5로 나눠버려서 -1 값을 출력해버린다.

최소의 개수를 맞추기위해 5로나눈다는 생각이 짧았다!!!! 

 

또 다시도전했을때 11을 입력했을때 -1 값이 출력되었다.

5a+3b 형식의 경우도 있고 최소를 구해야 한다. 다시 처음으로 돌아가서 생각하기위해

구글링..!

 

구글링을 열심히 해본 결과 표를 그려서 규칙을 찾자는 결론에 도달하였다.

 

처음 해온 생각을 그대로 가져와 무슨 수든 5로 나눠야 최소를 가질 수 있기에 5를 이용한 표를 그렸다.

 

한글로 하나하나 만든 표이다!.

 

이 표를 작성하면서 나온 규칙을 정리하자면

5로 나눈 나머지값은 항상 0~4까지의 수이다.

 

나머지값을 기준으로 

 

1. 나머지가 0일때 봉지의 수 = n/5의 몫 

2. 나머지가 1일때 봉지의 수 = n/5의 몫+1

3. 나머지가 2일때 봉지의 수 = n/5의 몫+2

4. 나머지가 3일때 봉지의 수 = n/5의 몫+1

5. 나머지가 4일때 봉지의 수 = n/5의 몫+2 

 

라는 규칙을 찾아냈다 

 

package test;

import java.util.Scanner;

public class test {

	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		
		if(n==4||n==7||n==1||n==2) {
			System.out.println("-1");
		}
		else if(n%5==0) {
			System.out.println(n/5);
		}
		else if(n%5==1||n%5==3) {
			System.out.println(n/5+1);
		}
		else if(n%5==2||n%5==4) {
			System.out.println(n/5+2);
		}
	}
}

 

수많은 트라이 끝에..! ㅠㅠㅠ  흐뭇하다!

'알고리즘 with 자바 > 그리디' 카테고리의 다른 글

백준 2217 : 로프 - JAVA  (0) 2021.03.17
백준 1541 : 잃어버린 괄호 - JAVA  (0) 2021.03.16
백준 5585 : 거스름돈 - JAVA  (0) 2021.03.16
백준 11047 : 동전 0 - JAVA  (0) 2021.02.16
백준 11399 : ATM - JAVA  (0) 2021.02.16

4. 프로그래밍 언어 활용

 4.1 서버프로그램 구현

  4.1.4 서버 프로그램 구현

  4.1.5 배치 프로그램 구현


1. 보안 취약성 식별

 

1.1 정의 및 개념

취약점은 공격자가 시스템의 정보 보증을 낮추는데 사용되는 약점이다.

시스템 민감성 또는 결함, 공격자가 결함에 대한 접근 그리고 공격자가 결함에 대한 익스플로잇 가능성

취약점을 익스프로잇하기 위해서, 공격자는 반드시 시스템의 약점에 접속할 수 있는 적어도 하나의 툴이나 기법을 가져야 한다.

이 경우에, 취약점은 또한 공격 영역이라고도 불린다.

 

1.2 취약점 식별과 제거

컴퓨터 시스템에서 취약점들을 발견할 수 있게 도와주는 많은 소프트웨어 툴들이 존재한다.

비록 이러한 툴들이 감시관에게 현재 존재할 수 있는 취약점들에 대한 좋은 개요를 제공할 수 있지만, 인간의 판단을 대체하지는 못한다.

단지 스캐너에게만 의존하는 것은 현재 시스템에 존재하는 문제들에 대한 제한된 관점과 긍정 오류를 만들 수 있다.

취약점들은 모든 주요 운영 체제들에서 발견되고 있다.

이러한 시스템들을 사용하면서 취약점들의 확률을 줄일 수 있는 유일한 방법은 감사와 최적의 배치, 세심한 시스템 관리를 포함한 꾸준한 조심을 통해서 가능해 진다.

 

1.3 취약점 사례

 

1. 시스템의 물리적 환경 취약점

직원, 관리, 조직 내에서 관리 절차와 보완 방식, 경영 활동과 서비스 전달, 하드웨어, 소프트웨어, 통신 장비와 시설, 그리고 이들의 조합

 

1,4 취약점 익스플로잇의 절차

공격자는 오버플로우 취약점을 찾아서 민감한 데이터를 내보내는 악성코드를 설치한다.

공격자는 사용자가 악성코드가 들어있는 이메일 메시지를 열게 만든다.

내부인이 보호되고 암호화된 프로그램을 USB에 담아와서 집에서 크랙한다.

1층에 설치된 컴퓨터 시스템에 수해로 인한 피해가 발생한다.

 

1.5 취약점 결과

보안 위반의 영향은 매우 크다. IT 관리자나 높은 관리직이 취약점이 있는 IT 시스템과 애플리케이션에 대해 쉽게 알 수 있는 것과 IT 위험에 대해 어떤 조치도 취하지 않는 것은 대부분의 경우에 좋지 않은 행위이다.

프라이버시 법은 관리자들이 보안 위험에 대한 영향과 가능성을 줄이는 것을 강요한다.

모의 해킹은 조직에 의해 채택된 약점과 대응책을 확인하는 형태이다.

 

1.6 소프트웨어 개발 보안

소프트웨어 개발 보안의 개념은 SW 개발 과정에서 개발자의 실수, 논리적 오류 등으로 인해 SW에 내포될 수 있는 보안취약점의 원인, 즉 보안 취약점을 최소화하고, 사이버 보안 위협에 대응할 수 있는 안전한 SW를 개발하기 위한 일련의 보안 활동이다.

 

2. API

 

2.1 API 정의

API는 응용프로그램에서 사용할 수 있도록, 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게만든 인터페이스를 말한다.

주로 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스를 제공한다.

 

2.2 절차적 언어에서의 API

대부분의 절차적 언어에서 API는 특정한 작업을 수행할 함수들의 집합을 규정하며, 특정 소프트웨어 구성 요소와 상호 작용할 수 있게 한다.

 

2.3 Window API

윈도우 API는 마이크로소프트 윈도 운영 체제들이 사용하는 API이다.

C/C++ 프로그램에서 직접 운영 체제와 상호 작용할 수 있도록 만들어졌으며, 그보다 더 낮은 수준의 제어는 Ntdll.dll을 사용한 낮은 수준의 DLL로 가능하다.

 

2.4 단일 유닉스 규격

단일 유닉스 규격은 컴퓨터의 운영체제가 유닉스란 이름을 사용하기 위해 지켜야 하는 표준 규격의 총칭이다.

SUS는 전기 전자 기술자 협회와 오픈크룹의 표준화 작업 결과물에 바탕을 두고 있으며 , 오스틴 그룹이 개발 및 유지 관리를 담당하고 있다.

단일 유닉스 규격 이전에 존재하였던 POSIX는 ISO/IEC JTC1에서의 작업은 종료되어, 오스텐 그룹이 유지 관리 작업에 관여하고 있다.

 

2.5 Java API

자바 API는 자바를 사용하여 쉽게 구현할 수 있도록 한 클래스 라이브러리의 집합이다.

자바라는 언어를 사용하여 사용자의 부담을 최소화하는 반면에 입출력, 화면 구성, 이미지, 네트워크와 같이 복잡하지만 필요한 클래스들을 미리 구현하여 사용자가 쉽게 구현하도록 하는 API이다.

이러한 자바 API는 하나의 커다란 클래스 계층구조로 설계되어 있다.

 

2.6 웹 API

웹 API는 웹 애플리케이션 개발에서 다른 서비스에 요청을 보내고 응답을 받기 위해 정의된 명세를 일컫는다.

예를 들어 블로그 API를 이용하면 블로그에 접속하지 않고도 다른 방법으로 글을 올릴 수 있다.

그 외에 우체국이 우편번호, API, 구글과 네이버의 지도, API등 유용한 API들이 많으므로 요즘은 홈페이지 구축이나 추가개편 시 따로 추가로 개발하지 않고 이런 오픈 API를 가져와 사용하는 추세다.

 

-배치 프로그램 구현

 

1. 배치 프로그램의 이해

 

1.1 배치 프로그램의 개념

배치 프로그램이란 사용자와의 상호 작용 없이 일련의 작업들을 작업 단위로 묶어 정기적으로 반복 수행하거나 정해진 규칙에 따라 일괄 처리하는 것이다.

 

1.2 배치 프로그램의 필수 요소

대용량 데이터 : 대용량의 데이터를 처리할 수 있어야 한다.

자동화 : 심각한 오류 상황 외에는 사용자의 개입 없이 동작해야 한다.

견고함 : 유효하지 않은 데이터의 경우도 처리해서 비정상적인 동작 중단이 발생하지 않아야 한다.

안정성 : 어떤 문제가 생겼는지, 언제 발생했는지 등을 추적할 수 있어야 한다.

성능 : 주어진 시간 내에 처리를 완료할 수 있어야 하고, 동시에 동작하고 있는 다른 애플리케이션을 방해하지 말아야 한다.

 

2. 배치 스케줄러

 

2.1 배치 스케줄러의 개념

배치 스케줄러는 일괄 처리를 위해 주기적으로 발생하거나 반복적으로 발생하는 작업을 지원하는 도구이다.

 

2.2 배치 스케줄러의 종류

 

1. 스프링 배치

스프링 배치는 Spring Source사와 Accenture사의 공동 작업으로 2007년에 탄생한 배치기반 오픈소스 프레임워크이다.

 

2. Quartz 스케줄러

Quartz 스케줄러란 Spring Framework에 플러그인되어 수행하는 job과 실행 스케줄을 정의하는 Trigger를 분리하여 유연성을 제공하는 오픈소스 스케줄러이다.

 

3. 배치프로그램 구현

 

3.1 애플리케이션 설계를 기반으로 배치 프로그램을 확인한다.

프로그램 관리 대상을 확인한다.

배치 설계서를 확인한다.

 

3.2 프로그램 관리 대장의 ID와 일치하는 배치 설계를 확인한다.

 

3.3 애플리케이션 설계를 기반으로 배치 프로그램을 구현한다.

배치프로그램을 구현하기 위한 SQL을 작성한다.

배치프로그램을 구현하기 위한 I/O 오브젝트를 정의한다.

배치 프로그램을 구현하기 위한 데이터 접근 오브젝트를 작성한다.

배치 프로그램을 구현하기 위한 스케줄러 클래스를 작성한다.

'자격증 > 정보처리기사' 카테고리의 다른 글

정보처리기사 37일차  (0) 2021.02.19
정보처리기사 36일차  (0) 2021.02.18
정보처리기사 34일차  (0) 2021.02.12
정보처리기사 33일차  (0) 2021.02.11
정보처리기사 32일차  (0) 2021.02.10

+ Recent posts