728x90

https://programmers.co.kr/learn/courses/30/lessons/60057

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

https://nodingco.tistory.com/50

 

[JAVA] 프로그래머스 60057.문자열압축 (Lv.2)

https://programmers.co.kr/learn/courses/30/lessons/60057 코딩테스트 연습 - 문자열 압축 데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데.

nodingco.tistory.com

접근 방법은 위의 JAVA 풀이에서 확인할 수 있습니다.

 

Python에서 String을 List로 바꿔주는 메소드는 split()이나 List의 생성자인 list()를 이용하면 됩니다. Python의 경우엔 정수 나눗셈의 몫을 구하고 싶을때 // 연산자를 활용할 수 있습니다.

 

def solution(s):
    # strArr = s.split('')
    strArr = list(s)

    answer = len(strArr)

    for i in range(1, len(strArr)//2 + 1):
        count = i
        idx = 0
        duple = 0
        for now in range(i, len(strArr) - (len(strArr) % i), i ):
            flag = True
            for j in range(0, i):
                if (strArr[idx + j] != strArr[now + j]):
                    flag = False
                    break
            if (flag):
                if(duple == 0):
                    duple = 2
                else:
                    duple +=1
            else :
                idx = now

                if (duple // 100 != 0):
                    count += 3
                elif (duple // 10 != 0):
                    count += 2
                elif (duple != 0):
                    count+=1
                count += i
                duple = 0
        if(duple // 100 != 0):
            count += 3
        elif (duple // 10 != 0):
            count += 2
        elif (duple != 0):
            count+=1
        
        duple = 0
        answer = min(answer, count + (len(strArr) % i))

    return answer

input = ["aabbaccc","ababcdcdababcdcd","abcabcdede","abcabcabcabcdededededede","xababcdcdababcdcd"]

for i in range(5):
    print(solution(input[i]))
728x90

https://programmers.co.kr/learn/courses/30/lessons/60057

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

https://nodingco.tistory.com/50

 

[JAVA] 프로그래머스 60057.문자열압축 (Lv.2)

https://programmers.co.kr/learn/courses/30/lessons/60057 코딩테스트 연습 - 문자열 압축 데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데.

nodingco.tistory.com

접근 방법은 위의 JAVA 풀이에서 확인할 수 있습니다.

 

JavaScript에서 String을 Array로 바꿔주는 방법은 스프레드연산자, Array.from() 메소드, split()메소드 등 여러가지가 있습니다. 결과는 동일합니다.JavaScript에서 / 연산은 기본적으로 소수점까지 나눠버리기 때문에 몫을 구하고 싶으면 parseInt()로 계산식을 감싸줘야합니다.

 

function solution(s) {
    const strArr = [...s]
    //const strArr = Array.from(s)
    //const strArr = s.split('')

    let answer = strArr.length;

    //console.log(strArr)

    for (let i = 1; i <= strArr.length / 2; i++) {
        let count = i;
        let idx = 0;
        let now = i;
        let duple = 0;
        for (; now < strArr.length - (strArr.length % i); now += i) {
            let flag = true;
            for (var j = 0; j < i; j++) {
                if (strArr[idx + j] !== strArr[now + j]) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                duple = (duple === 0) ? 2 : ++duple;
            } else {
                idx = now;

                if (parseInt(duple / 100) != 0) {
                    count += 3;
                } else if (parseInt(duple / 10) !== 0) {
                    count += 2;
                } else if (duple !== 0) {
                    count++;
                } 
                count += i;
                duple = 0;
            }
            //console.log("count", count, " duple",duple)
        }
        if (parseInt(duple / 100) !== 0) {
            count += 3;
        } else if (parseInt(duple / 10) !== 0) {
            count += 2;
        } else if (duple !== 0) {
            count++;
        } 
        duple = 0;
        //console.log(s,i,count," + ", (strArr.length % i))
        answer = Math.min(answer, count + (strArr.length % i));
    }

    return answer;
}


const input = ["aabbaccc","ababcdcdababcdcd","abcabcdede","abcabcabcabcdededededede","xababcdcdababcdcd"]

for(let i = 0; i < 5; i++){
    console.log(solution(input[i]))
}

//console.log(solution(input[0]))
728x90

https://programmers.co.kr/learn/courses/30/lessons/60057

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

 

지문이 한 번에 이해가 되지 않아 여러 번 읽어본 문자열 압축 문제입니다. 문제를 이해하면 구현하는것은 크게 어렵지 않지만, 고려해야할 상황이 두 개 있습니다.

 

1. 문자열이 압축되는 경우 중복된 문자열은 생략되고 중복갯수를 더해주어야 합니다.

2. 압축된 문자열의 갯수가 10,100처럼 한 자리가 아닌 여러 자릿수인 경우를 고려해야합니다.

 

저는 중복이 가능한 문자열의 모든 길이 (1 ~ 문자열의 총 길이/2)를 순회하며 문자열의 중복을 체크하고, 이 체크 갯수를 카운팅 한 뒤 중복이 끝나는 경우 갯수에 따라 길이를 늘려주는 식으로 구현했습니다.

문자열이 아닌 문자열의 길이가 필요한 정답이기에 문자열 대신 숫자만 카운트했습니다.

 

public class q60057_Programmers_문자열압축 {
	public static void main(String[] args) {
		String[] strArr = { "aabbaccc", "ababcdcdababcdcd", "abcabcdede", "abcabcabcabcdededededede",
				"xababcdcdababcdcd",  "aaaaaaaaaaaabcd", "xxxxxxxxxxyyy"};
		
		for (int i = 0; i < strArr.length; i++) {
			System.out.println(solution(strArr[i]));
		}
//		System.out.println(solution(strArr[5]));
	}

	private static int solution(String s) {
		char[] strArr = s.toCharArray();
		int answer = strArr.length;

		for (int i = 1; i <= strArr.length / 2; i++) {
			int count = i;
			int idx = 0;
			int now = i;
			int duple = 0;
			for (; now < strArr.length - (strArr.length % i); now += i) {
				boolean flag = true;
				for (int j = 0; j < i; j++) {
					if (strArr[idx + j] != strArr[now + j]) {
						flag = false;
						break;
					}
				}
				if (flag) {
					duple = (duple == 0) ? 2 : ++duple;
				} else {
					idx = now;

					if (duple / 100 != 0) {
						count += 3;
					} else if (duple / 10 != 0) {
						count += 2;
					} else if (duple != 0) {
						count++;
					} 
					count += i;
					duple = 0;
				}
			}
			if (duple / 100 != 0) {
				count += 3;
			} else if (duple / 10 != 0) {
				count += 2;
			} else if (duple != 0) {
				count++;
			} 
			duple = 0;
			answer = Math.min(answer, count + (strArr.length % i));
		}

		return answer;
	}
}
728x90

https://programmers.co.kr/learn/courses/30/lessons/42888

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

 

주어진 조건에 따라 동작하는 프로그램을 구현하는 문제입니다.

채팅방의 입장,퇴장에 따른 출력은 그대로 구현하면 되지만 uid와 달리 nickname은 변할 수 있으므로 uid를 기준으로 최종 상태의 nickname을 찾고 방의 기록을 다시 한 번 순회하면서 return할 String 배열을 만들었습니다.

 

Case문을 이용하여 입력된 기록을 입장,퇴장,이름변경으로 구분해 필요한 작동이 이루어지게하고

최종상태의 nickname은 HashMap을 활용해서, uid를 Key로 하고 각 uid마다 부여한 index를 Value로 정해주고 이 값을 String을 담은 ArrayList의 index와 맞춰서 갱신하는 식으로 구현했습니다.

 

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class q42888_Programmers_오픈채팅방 {
	public static void main(String[] args) {
		String[] record = { "Enter uid1234 Muzi", "Enter uid4567 Prodo", "Leave uid1234", "Enter uid1234 Prodo",
				"Change uid4567 Ryan" };
		System.out.println(Arrays.toString(solution(record)));
	}

	private static String[] solution(String[] record) {
        Map<String, Integer> userMap = new HashMap<String, Integer>();
		ArrayList<String> userNick = new ArrayList<String>();
		int[][] log = new int[record.length][2];
		int index = 0;
		int count = 0;

		for (int i = 0; i < record.length; i++) {
			StringTokenizer st = new StringTokenizer(record[i]);
			String act = st.nextToken();
			switch (act) {
			case "Enter":
				String id1 = st.nextToken();
				if (!userMap.containsKey(id1)) {
					userMap.put(id1, index);
					log[i][0] = index;
					userNick.add(st.nextToken());
					index++;
				} else {
					userNick.set(userMap.get(id1), st.nextToken());
					log[i][0] = userMap.get(id1);
				}
				log[i][1] = 1;
				count++;
				break;
			case "Leave":
				String id2 = st.nextToken();
				log[i][0] = userMap.get(id2);
				log[i][1] = 2;
				count++;
				break;
			case "Change":
				String id3 = st.nextToken();
				userNick.set(userMap.get(id3), st.nextToken());
				break;
			default:
				break;
			}
		}

		String[] answer = new String[count];
		index = 0;

		for (int i = 0; i < log.length; i++) {
			if (log[i][1] == 1) {
				answer[index++] = new StringBuilder().append(userNick.get(log[i][0])).append("님이 들어왔습니다.").toString();
			}else if(log[i][1] == 2){
				answer[index++] = new StringBuilder().append(userNick.get(log[i][0])).append("님이 나갔습니다.").toString();
			}
		}

		return answer;
    }
}
728x90

https://programmers.co.kr/learn/courses/30/lessons/77484

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

https://nodingco.tistory.com/45

 

[JAVA] 프로그래머스 77484.로또의 최고 순위와 최저 순위 (Lv.1)

https://programmers.co.kr/learn/courses/30/lessons/77484 코딩테스트 연습 - 로또의 최고 순위와 최저 순위 로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다..

nodingco.tistory.com

접근 방법은 위의 JAVA 풀이에서 확인할 수 있습니다.

 

function solution(lottos, win_nums) {
    let answer = [0,0];
    const grade = [ 6, 6, 5, 4, 3, 2, 1 ];

    let p = 0;
    let c = 0;

    for (let i = 0; i < 6; i++) {
        if (lottos[i] == 0) {
            p++;
        } else {
            for (let j = 0; j < 6; j++) {
                if (lottos[i] == win_nums[j]) {
                    c++;
                    break;
                }
            }
        }
    }
    
    answer[0] = grade[p+c];
    answer[1] = grade[c];
    
    return answer;
}

lottos = [ 44, 1, 0, 0, 31, 25 ]
win_nums = [ 31, 10, 45, 1, 6, 19 ]

console.log(solution(lottos, win_nums))
728x90

https://programmers.co.kr/learn/courses/30/lessons/77484

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

 

https://nodingco.tistory.com/45

 

[JAVA] 프로그래머스 77484.로또의 최고 순위와 최저 순위 (Lv.1)

https://programmers.co.kr/learn/courses/30/lessons/77484 코딩테스트 연습 - 로또의 최고 순위와 최저 순위 로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다..

nodingco.tistory.com

접근 방법은 위의 JAVA 풀이에서 확인할 수 있습니다.

 

def solution(lottos, win_nums):
    grade = [ 6, 6, 5, 4, 3, 2, 1 ]
    answer = []
    p = 0
    c = 0
    
    for i in range(6):
        if(lottos[i] == 0):
            p+=1
        else:
            for j in range(6):
                if(lottos[i] == win_nums[j]):
                    c+=1
    answer.append(grade[p+c])
    answer.append(grade[c])
    
    return answer

lottos = [ 44, 1, 0, 0, 31, 25 ]
win_nums = [ 31, 10, 45, 1, 6, 19 ]

print(solution(lottos, win_nums))
728x90

https://programmers.co.kr/learn/courses/30/lessons/77484

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

 

지난번에 풀었던 신고결과받기 문제가 레벨1 치고 신경쓸게 많아서 걱정했는데,

이번 문제는 정말 간단한 난이도였습니다.

라이브러리나 자료구조(배열을 제외한)의 활용 없이 반복문과 조건문 정도만 사용해도 풀이가 가능했습니다.

 

내 로또에서 맞춘 번호의 갯수를 c (Correct Number) 맞출 가능성이 있는 번호의 갯수를 p (Potential Number)로 따로 카운팅하고 번호 갯수에 따라 미리 등수 배열을 만들어 놓은 뒤 넣어주는 식으로 구현했습니다.

 

만약 로또용지의 번호 갯수가 달랐다면 내가 이미 맞춰서 소비된 번호를 고려한다던지 예외적인 상황이 발생했을것 같지만 문제의 조건에선 별다른 특이사항이 보이지 않아서 쉽게 구현했습니다.

 

import java.util.Arrays;

public class q77484_Programmers_로또의최고순위와최저순위 {

	static int[] lottos = { 44, 1, 0, 0, 31, 25 };
	static int[] win_nums = { 31, 10, 45, 1, 6, 19 };

	public static void main(String[] args) {
		int[] answer = { 0, 0 };
		int[] grade = { 6, 6, 5, 4, 3, 2, 1 };

		int p = 0;
		// potential Num
		int c = 0;
		// correct Num

		for (int i = 0; i < 6; i++) {
			if (lottos[i] == 0) {
				p++;
			} else {
				for (int j = 0; j < 6; j++) {
					if (lottos[i] == win_nums[j]) {
						c++;
						break;
					}
				}
			}
		}
		
		answer[0] = grade[p+c];
		answer[1] = grade[c];
		
		System.out.println(Arrays.toString(answer));
	}
}

 

 

728x90

프로그래머스 코딩테스트 연습의 문제입니다.

 

https://programmers.co.kr/learn/courses/30/lessons/92334

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

 

 

 

 

문제 자체는 간단한 시뮬레이션입니다.

주의해야할 점은 신고를 당한 이용자가 아닌 신고자에게 결과를 보내야한다는 점,

그리고 같은 신고를 여러번 하는 경우를 예외처리해 하나로 카운팅 해야 한다는 점 입니다.

 

저는 HashMap 자료구조를 활용해 이용자의 id를 Integer로 연결시키고,

같은 크기의 배열을 활용해 신고 기록을 저장, 활용했습니다.

이용자의 전체 크기가 최대 1000명이기 때문에 해당 2차원 배열의 크기는 1000x1000으로 코딩테스트에서 사용하기에 큰 무리가 없다고 생각했습니다.

 

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class q92334_Programmers_신고결과받기 {

	static String[] id_list = { "muzi", "frodo", "apeach", "neo" };
	static String[] report = { "muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi" };
	static int k = 2;

	public static void main(String[] args) {

		int user = id_list.length;
		boolean[][] log = new boolean[user][user];
		int[] count = new int[user];
		int[] answer = new int[user];
		Map<String, Integer> map = new HashMap<String, Integer>();

		for (int i = 0; i < id_list.length; i++) {
			map.put(id_list[i], i);
		}

		for (int i = 0; i < report.length; i++) {
			StringTokenizer st = new StringTokenizer(report[i]);
			int reporter = map.get(st.nextToken());
			int target = map.get(st.nextToken());

			if (!log[reporter][target]) {
				log[reporter][target] = true;
				count[target]++;
			}
		}
		
		for(int i = 0; i < id_list.length; i++) {
			if(count[i] >= k) {
				for(int j = 0; j < id_list.length; j++) {
					if(log[j][i]) {
						answer[j]++;
					}
				}
			}
		}
		
		System.out.println(Arrays.toString(answer));
	}
}

 

728x90

11. 안드로이드

리눅스 커널을 기반으로 동작하며 JAVA, Kotlin언어로 개발된 모바일 기기에 주로 사용되는 오픈소스 플랫폼 운영체제

 

12. SQL

 

 

13. SOAP

SOAP (Simple Object Access Protocol)

Http등의 프로토콜을 이용해 XML 기반의 메세지를 교환하는 프로토콜.

구성하는 주요 3요소 : Envelop - Header - Body

REST API로 대체 가능, 표준기술 기반이나 XML을 사용해 상대적으로 무거움.

 

 

14. SQL Injection

웹 페이지의 입력값으로 SQL명령어를 입력해 서버의 오동작을 유도하는 해킹방법.

로그인을 하거나 서버의 DB정보를 알아내거나 개인 정보를 추출함

 

대응법 : 입력값 검증, Prepared Statement(DBMS 드라이버에서 SQL문장을 미리 준비), 방화벽, 에러 출력 방지 등

 

 

15. 인터페이스

 

- 인터페이스 설계의 기본 원칙

직관성: 누구나 쉽게 이해하고 사용할 수 있어야 한다.
유효성: 사용자의 목적을 정확하게 달성하여야 한다.
학습성: 누구나 쉽게 배우고 익힐 수 있어야 한다.
유연성: 사용자의 요구사항을 최대한 수용하며, 오류를 최소화하여야 한다.

 

와이어프레임(Wireframe), 목업(Mockup), 스토리보드, 프로토타입(Prototype), 유스케이스(Usecase) 등으로 설계

 

16. 리눅스 chmod

리눅스 운영체제에서 파일에 대한 권한을 변경하는 chmod 명령어

$ chmod [권한] [파일]

- 각 권한은 읽기4, 쓰기2, 실행1 로 부여됨.

Ex) 읽기와 쓰기 권한이 있으면 4+2 = 6

 

- 순서대로 소유자 / 그룹 / 다른 사용자 를 의미함.

Ex) 소유자에게 읽기, 그룹에게 쓰기, 다른 사용자에게 실행 권한을 부여하려면  chmod 421

 

권한 확인은 ls 명령어로, 소유 그룹 변경은 chgrp 명령어로 

 

17. Linked Open Data

전세계 오픈된 정보를 하나로 묶는 방식
Linked data와 Open data의 합성어
URI(Uniform Resource Identifier)를 사용
RESTful 방식으로 볼 수 있으며, 링크 기능이 강조된 시멘틱 웹에 속하는 기술

 

 

18. 데이터베이스 설계

DB 설계 과정

요구사항 분석, 정의 -> 개념 설계 -> 논리 설계 -> 물리 설계 -> 데이터베이스 구현

 

 

19. JAVA

JAVA 상속(extends), super 문제

 

 

20. 형상관리

소프트웨어 개발 과정에서 산출물 등의 변경에 대비하기 위해 반드시 필요하다. 소프트웨어 리사이클 기간 동안 개발되는 제품의 무결성을 유지하고 소프트웨어의 식별, 편성 및 수정을 통제하는 프로세스를 제공한다. 실수를 최소화하고 생산성의 최대화가 궁극적인 목적이다. 관련 도구로는 CVS, SVN, Clear Case 등이 있다.

 

 

728x90

1. RPO RTO

Recovery Point Objective : 복구 시점 목표

시스템 장애, 업무 중단 시 백업수단을 통해 복구할 수 있는 기준점.

Recovery Time Objective : 복구 시간 목표

시스템 장애 발생, 업무 중단 시점으로부터 업무가 복구되어 정상가동 될 때까지의 시간.

 

RPO와 RTO 모두 시스템 장애 시간으로부터 가까울 수록 좋으나, 더 많은 비용 소모.

 

Business Impact Analysis : 업무 영향 분석

재난, 재해로부터 시스템 중단을 가정하여 중단 시간에 따른 영향도를 분석해 복구의 우선순위를 정하고 업무재개를 위해 필요한 자원을 도출해 냄.

 

 

2. 파이썬

파이썬 Set 자료구조 활용

 

3. AJAX

Asynchronous JavaScript And XML 

비동기적인 웹 어플리케이션 제작을 위해 사용하는 기법이다.

기존의 웹사이트들은 사용자가 어떤 요청(데이터)을 보내면 서버에서 그 요청을 가공해서 새로운 웹페이지를 응답했다. 

하지만 AJAX를 이용한 웹사이트에서는 웹페이지가 아닌 데이터만 비동기적으로 응답된다.

따라서 통신되는 코드와 데이터 양을 줄일수 있고 대기시간 없이 화면전환이 가능하다.

 

 

4. 애자일 방법론

소프트웨어 개발 방법론의 하나로, 처음부터 끝까지 계획을 수립하고 개발하는 폭포수(Waterfall) 방법론과는 달리 개발과 함께 즉시 피드백을 받아서 유동적으로 개발하는 방법.

특정한 방법을 말하기 보다는 방향성을 의미.

공정과 도구보다 개인과 상호작용을
포괄적인 문서보다 작동하는 소프트웨어를
계약 협상보다 고객과의 협력을
계획을 따르기보다 변화에 대응하기를

 

5. JAVA

JAVA 언어에서의 상속(extends) 활용

 

6. SQL

 

 

7. SQL-ROLLBACK

ROLLBACK : 트랜잭션이 실패했을때 작업을 취소하고 변경된 데이터를 이전 상태로 되돌리는 데이터 제어어

 

8. IPSec

네트워크 계층인 인터넷 프로토콜(IP)에서 '암호화', '인증', '키 관리'를 통해 보안성을 제공해 주는 표준화된 기술

보안에 취약한 구조를 가진 IP의 보안을 위하여 통신 세션의 각 IP패킷을 암호화하고 인증하는 IPS(Internet Protocol Suite)

IPv4에선 보안이 필요한 경우에만 선택적으로 사용하였지만 IPv6부턴 기본 스펙에 포함됨

 

9. 분석

정적 분석, 정적 테스트 (Code Inspection)

실행상의 장애 보다는 코드의 결함을 찾음. (코드 보안 취약점, 코딩 표준 위반, Dead Code, 일관성 깨짐 등)

Inspection : 공식적 검사

Peer Review : 프로젝트 과정에서 동료들이 상호교차 검토

WalkThrough : 개발 초기에 팀 내에서 수행하는 검토

 

동적 테스트 (Dynamic Testing)

소프트웨어의 코드를 직접 실행시키며 수행하는 테스트.

 

블랙박스 테스트 : 모듈 안은 보지 않고 입력과 출력을 관찰.

화이트박스 테스트 : 모듈 안의 작동을 직접 관찰, 논리적인 구조가 커버되도록 tc를 설계

 

명세 기반 테스트 동치 분할 기법
경계값 분석
결정 테이블 테스트
상태 전이 테스트
Use Case 테스트
구조 기반 테스트 구문 테스트
결정 테스트
조건 테스트
경험 기반 테스트 탐색적 테스트
애드혹 테스트
애자일 테스트

10. 디자인패턴


생성패턴

- 객체를 생성할때 사용하는 패턴들, 객체생성과정의 유연성을 높이고 코드의 유지를 쉽게 함 Factory Method

Abstract Factory

Builder

Singleton


구조패턴

- 프로그램 구조 패턴들. 프로그램 내의 자료구조, 인터페이스 등을 설계할 때 활용 Adaptor

Composite

Decorator

Facade

Flyweight

Proxy


행위패턴

- 자주 사용되는 객체들의 상호작용을 패턴화 Chain of Responsibility

Command

Interpreter

Iterator

Mediator

Memento

Observer

State

Strategy

Template Method

Visitor

 

728x90

11. OSI 7계층

네트워크 관련 지식인 OSI 7계층을 알고 있는지 묻는 문제입니다. 

물리계층
Physical Layer
bit 단위 실제로 장치들이 연결되기 위한 전기적, 전자적 세부사항을 정의하는 계층.
디지털 데이터 -> 전기신호로 변환.
주소개념이 존재하지 않는다.
Hub, Repeater
데이터링크 계층
Data Link Layer
Frame 단위 인접한 노드간의 신뢰성 있는 데이터 전송. MAC 주소를 통해 목적지 탐색.
흐름제어, 오류제어, 회선제어
네트워크 계층
Network Layer
Packet(패킷) 단위 여러개의 노드를 거칠 때 최적의 경로를 찾아주는 라우팅이 이루어짐.
논리적인 IP주소를 가짐
IP프로토콜, 라우팅 프로토콜이 사용됨
전송 계층
Transport Layer
Segment 단위 양 끝단의 사용자들이 주고받는 데이터의 신뢰성을 보장. 연결의 유효성과 효율성을 관리.
TCP, UDP 프로토콜등이 사용됨
세션 계층
Session Layer
Message, Data 단위 양 끝단의 응용 프로세스가 통신을 관리하기 위한 방법을 제공.
표현 계층
Presentation Layer
인코딩/디코딩, 압축/해제, 암호화/복호화 등 코드간의 번역을 담당해 응용 계층의 부담을 덜어줌
응용 계층
Application Layer
일반적인 응용 서비스를 제공
HTTP 프로토콜

헷갈릴만한 개념으로는 TCP/IP 5계층이 있습니다

(물리 - 데이터링크 - 네트워크 - 전송 - 응용)

 

 

12. LoC기법

Line of Code

코드 라인수의 낙관치, 기대치, 비관치로 예측치를 구하고 이것으로 프로그램 개발 시간을 예측하는 기법.

예측치 : (낙관치 + 4 * 기대치 + 비관치) / 6

 

예시 ) 프로그램의 예측된 라인수가 10000라인이고 프로그래머가 일 평균 100라인을 작성하고 프로그래머가 5명일때 개발 기간은 10000/(100*5) = 20일

 

 

13. 애플리케이션 성능측정

성능테스트(목적에 따른 구분)

단위 성능 테스트 특정 기능별로 수행하는 테스트
복합 성능 테스트 실제 사용자의 패턴을 적용하는 테스트
임계 성능 테스트 시스템이 발휘할 수 있는 최대 성능을 테스트

성능테스트(방법에 따른 구분)

스파이크 테스트 트랜잭션을 동시에 발생시켜 테스트
확장성 테스트 물리적인 시스템의 증설과 향상 비율이 다르기 때문에 이를 확인하는 테스트
가용성 테스트 특정한 부하 상태에서 시스템의 안전성을 테스트

성능지표

전체 사용자 서비스를 사용하는 모든 사람
동시 사용자 특정 시점에 시스템에 접속해 서비스를 사용하는 사용자
부하 사용자가 시스템에 요청하는 처리량
응답시간 사용자가 서버에 서비스를 요청한 후 그에 대한 응답을 받을 때까지 걸리는 시간
처리량 단위 시간당 시스템에 의해서 처리되는 건 수.
경과시간 서비스에 작업을 요청한 시간부터 완료될 때까지 걸린 시간.

14. 소프트웨어 모듈화

시스템의 계층을 나누고 기능별로 분해하여 성능, 유지보수성, 재사용성 등을 향상시키는 설계기법.

모듈화의 목표 -> 결합도를 낮추고 모듈 내 응집도를 높이는 것.

 

응집도 : 모듈의 내부기능이 얼마나 연관되어 있는가.

결합도 : 모듈간 얼마나 구분이 되어 있는가.

 

 

 

15. 데이터베이스 정규화 & 반정규화

정규화 : 데이터 베이스 테이블 간에 중복된 데이터를 허용하지 않아 무결성을 유지. 삽입,갱신 등에서 이상(Anomaly)을 방지하는 것.

 

반정규화 : 데이터베이스 성능향상을 위해 의도적으로 정규화에 어긋난 데이터 구조로 만드는 행위

테이블 합병, 중복칼럼 추가, 계산된 칼럼 추가 등등

 

16. 공유도(팬인 Fan-In)  제어도(팬아웃 Fan-Out)

공유도(팬인 Fan-In) : 나를 제어할 수 있는 다른 모듈의 갯수

제어도(팬아웃 Fan-Out) : 제어할 수 있는 다른 모듈의 갯수

 

 

17. C언어

c언어 반복문

 

 

18. C언어 CASE 문

case 조건문에서 break; 구문이 없을시의 특징을 묻는 문제입니다.

 

 

19. JAVA

java 반복문

 

 

20. SQL

기본적인 SQL 쿼리문을 이해하는지 묻는 문제이다. SQL 쿼리에 대해서는 따로 정리해서 올리도록 하겠습니다. 

728x90

신청한게 엊그제 같은데 벌써 정보처리기사 실기 시험이 2주 남았다.

작년엔 코로나로 불참 + 싸피로 바빠서 공부도 별로 하지 못하고 응시료만 날렸는데 백수인 지금은 2주 전부터 미리미리(?) 준비를 해서 한 번에 통과하겠다는 각오다.

문제를 직접 올리는건 저작권에 걸릴까봐 문제에서 묻는 개념 키워드를 설명하는 식으로 작성하겠다.

 

 

 

1. XML

웹 관련 프로그래밍을 해본 사람이면 AJAX라던지, XMLrequest 라던지 여러모로 익숙한 친구이다.

XML은 EXtensible Markup Language의 앞글자를 따서 붙인 이름으로 HTML의 부족한 부분을 보완하기 위해 만든 마크업 언어이다. 

 

마크업 언어는 데이터를 표현하기 위해 사용하는 문법으로 (프로그래밍 언어가 아니다!) 익숙한 HTML도 마크업 언어의 하나이다.단순히 HTML로 표현된 정적인 웹페이지의 위주이던 초창기 인터넷 환경에서 여러 데이터가 오갈 필요가 생기게 되는데 HTML의 경우엔 서로 다른 사이트 간에 데이터의 의미를 정확히 전달하기가 어려웠다.

예를들어 내가 학생명부를 보내려고 <p> 이름:김철수 학번:1234 , 이름:박철수 학번:1111 </p> 이런 데이터를 보냈을때 상대 사이트에선 학생 데이터가 온다는건 알아도 저 정보를 파싱하기 위한 파서가 따로 필요하다. 

또 내가 실수로 데이터 순서를 바꾸어 보낸다던지 할 경우 데이터가 뒤섞일 우려가 있다.

 

XML의 경우엔

<학생명부>
   <학생데이터>
        <이름>김철수</이름>
        <학번>1234</학번>
   </학생데이터>
   <학생데이터>
        <이름>박철수</이름>
        <학번>5678</학번>
   </학생데이터>
</학생명부>

이런 형태로 깊이와 태그명을 사용해서 데이터를 표현할 수 있다. 

지금은 이런 XML도 복잡하다고 JSON을 많이 사용하는데... 나중에 마크업언어들을 따로 정리해야겠다.

 

 

 

2. JSON

호랑이도 제 말 하면 온다더니 곧바로 JSON의 개념을 묻는 문제가 나왔다.

JSON은 속성-값 으로 이루어진 포맷이다.

아까 말했던 AJAX (Asynchronous JavaScript and XML)는 이름부터 XML이 들어가 있지만 요즘은 XML대신 JSON을 사용해 데이터를 전달한다. 

JSON을 사용해 아까 XML로 나타냈던 데이터를 표현하면 이런 느낌이다.

{
	"학생명부" : [{"이름":김철수, "학번":1234}, {"이름":박철수, "학번":5678}]
}

XML이던 JSON이던 프로그래머가 작성하기 나름이지만 JSON이 상당히 간료해 보이는걸 알 수 있다.

 

 

 

3. 릴리즈노트

릴리즈 노트는 소프트웨어 제품과 함께 배포되는 문서들을 말하며, 제품이 개발 중이거나 테스트 상태일 때 추가되기도 한다. 고객이 이미 사용 중인 제품의 경우 릴리즈 노트는 업데이트가 출시될 때 고객에게 전달된다. (위키피디아 설명)

그렇다고 한다. 흔히 우리가 사용하는 프로그램을 업데이트 했을때

어쩌구게임 ver 2022.378831 패치내역

1. 비쥬얼 업데이트를 적용함.
2. 김철수 캐릭터의 밸런스를 조정함.
3. 특정 상황에서 채팅이 쳐지지 않던 버그를 수정함.

이런 창을 보게 되는데 그런걸 생각하면 될 것 같다. 

릴리즈노트는 표준형식이 없이 프로그램의 개발 회사나 팀에 따라 다양하게 작성되는데, 보편적인 구성 항목은 이렇다고 한다.

머릿말: 문서 이름(예: 릴리스 노트), 제품 이름, 릴리스 번호, 출시일, 노트 날짜, 노트 버전 등.
개요: 다른 공식 문서가 없을 때 제품과 변경사항에 대한 간략한 개요.
목적: 버그 픽스와 새로운 기능을 포함한 이 릴리스의 새로운 사항의 나열과 더불어 릴리스 노트의 목적에 대한 간략한 개요.
문제 요약: 릴리스의 버그나 개선사항에 대한 짧은 설명.
재현 단계: 버그 발생을 재현하기 위한 절차.
해결책: 버그 수정을 위한 수정/개선사항의 짧은 설명.
최종 사용자 영향: 응용 프로그램의 최종 사용자에게 필요한 조치. 이 변경사항으로 인해 다른 기능이 영향을 받는지의 여부가 포함되는 것이 좋다.
지원 영향: 소프트웨어 관리의 일일 프로세스에 필요한 변경사항.
참고: 소프트웨어나 하드웨어의 설치, 업그레이드, 제품 문서화에 관한 참고사항. (문서화 업데이트 포함)
면책: 회사와 표준 제품 관련 메시지 (예: 프리웨어, 불법 복제 금지 등)
연락처: 지원 연락처 정보.

 

 

 

4. 살충제 패러독스

애플리케이션 테스트의 기본 원리 중, 살충제 패러독스의 의미를 묻는 문제이다.

살충제 패러독스는 이름 처럼 같은 테스트를 반복해서 실행할 시 프로그램의 장애, 버그를 찾을 수 없다는 개념을 의미한다.

 

예를 들어 우리가 어떤 길찾기 프로그램을 만들었다고 하자.

프로그램이 잘 작동하는지를 확인하기 위해 회사에서 근처의 편의점을 가는 경로를 찾아봤더니 오류가 발생했다!

열심히 오류를 고치고 다시 테스트 했더니 완벽하게 동작한다.

그 후 프로그램이 몇번의 업데이트를 거치고 다시 테스트의 시간이 되었다.

예전에 했던 테스트를 똑같이 반복해 근처의 편의점을 가는 경로를 검색했더니 잘 나온다. 와! 

 

그럼 이 프로그램은 버그가 없는걸까? 

우리가 이전의 테스트(살충제)를 통해 확인한 오류를 고쳤기 때문에 해당 버그는 사라졌지만, 다른 곳에는 어떤 버그가 남아있을지 모른다.

수천명이 동시접속하면 서버가 터질 수도 있고, 편의점 대신 병원을 검색하거나 PC가 아니라 모바일 환경에서 접속하면 버그가 발생할 수도 있다.

 

이렇듯 같은 방법의 테스트를 반복하면 오류를 찾을 수 없다는게 살충제 패러독스의 의미이다.

 

 

 

5. 데이터 마이닝

요 10년 사이에 핫해진 빅데이터 관련 용어이다. 

데이터 마이닝이란 "많은 데이터에서 데이터간의 관계를 찾아내어 유용하고 가치있는 정보를 추출해 내고 이를 의사결정에 이용하는 과정" 이라고 말할 수 있을것 같다.

참고로 데이터 마이닝과 데이터 크롤링, 웹 크롤링이 조금 혼동되는데 보통 데이터 마이닝은 모여진 데이터에서 의미를 찾는 과정. 데이터 크롤링은 그 데이터를 모으는 과정이라고 생각하면 될 것 같다.

 

 

 

6. 프로토콜

Protocol

컴퓨터들 간의 원활한 통신을 위해 지키기로 약속한 규약. 프로토콜에는 신호 처리법, 오류처리, 암호, 인증, 주소 등을 포함한다. 통신을 원하는 두 개체간에 무엇을 어떻게 언제 통신할 것인지 약속해 둔 규약이다.

우리가 네트워크에서 배운 TCP/IP 나 HTTP도 프로토콜이다.

 

프로토콜을 구성하는 세가지 요소는 이렇다.

-구문(Syntax)

   데이터의 형식(아날로그 or 디지털), 부호화(Unicode, ASCII), 신호크기를 정하는 구문

-의미(Semantics)

   전송제어 (동기화, 전송정지 및 재개, 완료, 재전송, 등등의 신호를 정함), 오류수정(데이터 무결성, 패리티비트, CRC)

-시간(Timing) :

   신호의 지속시간, 신호의 순서 등을 정하여 타이밍을 이룸

 

 

 

7. 해시함수

해시함수의 종류와 설명을 정확히 알고 있는지를 묻는 문제인데, 개인적으로 정말 싫어하는 유형이다.

중요한 해시함수들의 설명은 이렇다.

SHA-1 160 비트 암호화
512비트입력 -> 160비트 출력
SHA-256, SHA-512로 대체되고 있음
전자서명
MD5 128비트 기반 암호화 해시함수
결과 값은 16개 문자열
MD4를 대체하기 위해 개발
무결성 검사
HAVAL MD5를 변형에서 만듬
128-256비트까지 다양한 크기가 가능
MD5 단점 보완
Tiger 64비트 CPU에 최적화 됨
32비트 CPU에서도 빠르게 동작함
64비트 CPU의 해시

 

 

8. 스케쥴링

운영체제 전공 수업때 배운 스케쥴링 문제이다.

비선점 스케쥴링
한 번 프로세스가 실행되면 끝날때까지 계속 작업이 이루어짐.

장점: 공정한처리, 시간예측이 쉬움
단점: 비효율이 발생
FCFS (FIFO)
First Come First Served
(First In First Out)
큐와 똑같은 선입선출 스케쥴링
먼저 들어온 프로세스가 먼저 실행된다.
SJF
Shortest Job First
실행시간이 짧은 프로세스부터 실행된다.
HRN (HRRN)
Highest Response-ratio Next
SJF를 보완하기 위한 스케쥴 방법.
대기시간을 이용해서 우선순위를 정함.
공식->(대기시간+실행시간)/실행시간
선점 스케쥴링
다른 프로세스가 실행중일때도 우선순위가 높으면 CPU를 빼앗을 수 있음.

장점: 우선순위 높은 작업을 빠르게처리
단점: 시간 배당을 위한 타이머, 선점으로 인한 오버헤드 발생

RR
Round Robin
FCFS처럼 먼저 들어온 순서대로 처리하지만, 일정 시간이 지나면 다음 프로세스를 실행.
시간간격이 클 수록 FCFS와 비슷해짐
SRT
Shortest Remaining Time First
일정 시간(Time quantum)을 정하고 그 시간만큼 프로세스가 실행될 때마다 남은 시간이 짧은 프로세스를 가져와 실행한다.
SJF에서 공정성을 조금 높인 알고리즘.
MLQ
Multilevel Queue
작업들을 여러 그룹으로 나누어 여러개의 큐로 실행.
각 큐별로 최적화된 다른 스케쥴링을 가진다.
MLFQ
Multilevel Feedback Queue
IO위주와 CPU위주인 프로세스를 구분하고 실행시간이 길어질수록 점점 높은 우선순위 큐로 이동.
마지막 단계에서는 RR방식으로 처리.

 

 

9. 데이터베이스 트랜잭션

트랜잭션 Tx, Transaction의 특성

원자성 (Atomicity) 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는것을 보장.
Commit, Rollback 명령어
일관성 (Consistency) 트랜잭션이 성공적으로 실행되면 DB 상태를 일관성 있게 유지하는 것.
격리성 (Isolation) 트랜잭션이 수행되는 동안 다른 트랜잭션의 작업이 끼어들지 않도록 보장.
트랜잭션 바깥에선 연산의 중간단계를 볼 수 없음.
지속성 (Durability) 성공적으로 실행된 트랜잭션을 영원히 반영.

 

 

 

10. 서비스 거부 공격

DoS (Denial of Service)

시스템이 정상적인 서비스를 할 수 없도록 하는 공격을 의미한다.

DDoS는 다수의 좀비 PC을 이용해 정상적인 요청을 막대하게 보내는 방식으로 공격하지만 DoS는 서비스의 취약점을 노리고 보내는 공격이다.

 

Ping of Death Attack Ping을 이용해서 아주 크게 만든 패킷을 전송하면 네트워크에서 분할된 모든 패킷을 공격 목표가 처리하느라 부하가 발생
Land Attack 출발지와 목적지가 같은 패킷으로 공격 목표가 자기 자신에게 응답을 하게 해 부하를 유발
Smurf Attack 출발지를 공격 대상으로 위조한 패킷을 광범위하게 뿌려 다수의 응답을 받게 만들어 부하 유발
Teardrop Attack 하나의 IP패킷이 분할된 단편의 offset값이 중첩되도록 조작해서 이를 재조합 해야 되는 공격대상 시스템의 부하를 유발
TCP Flooding TCP 3-Way-Handshake에서 공격목표가 SYN을 받으면 ACK을 보내고 이 작업을 큐에 담아 응답을 기다리는데 SYN을 보내고 ACK은 보내지 않는 방식으로 큐를 채워 부하를 유발

해결방법 : 큐의 크기를 늘린다, 쿠키를 사용해 같은 SYN을 무시, 응답을 기다리는 시간을 제한함 (Timeout) 등

+ Recent posts