no image
[백준 1152번 문제, C] 단어의 개수
문제 시간 제한메모리 제한제출정답맞힌 사람정답 비율 2 초 128 MB 302070 95671 76555 32.413% 문제 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다. 입력 첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다. 코드 #define _CRT_SECURE_NO_WARNINGS #include #include // strlen (문자열 길이 체크용) #inclu..
2023.04.02
no image
토익 600 ~ 700 기초 학습 노트 (6) 동명사
동명사 주어, 목적어, 보어로서 동사 + ing 형태로 사용된다 동명사의 역할과 동명사 목적어 동명사의 역할 1. 동사 + ing 형태로 to부정사와 함께 준동사에 포함된다 2. 문장 내에서 주어, 동사, 전치사의 목적어, 그리고 보어의 역할을 한다 3. 명사 앞에서 뒤에오는 명사를 수식하는 형용사로 쓰일 수도 있다(명사 뒤에는 사용할 수 없음..?) 주어 Smoking is not allowed in the building. 이 건물에서 담배를 피우는 것은 허락되지 않는다. * 동명사 주어는 항상 3인칭 단수 취급하기 때문에 단수 동사를 쓴다. 동사의 목적어 Mr. Jackson suggested having a meeting this week. Jackson 씨는 이번 주에 회의를 열자고 제안했다. ..
2023.03.30
no image
[백준 1969번 문제, Python3] DNA
문제 문제 DNA란 어떤 유전물질을 구성하는 분자이다. 이 DNA는 서로 다른 4가지의 뉴클레오티드로 이루어져 있다(Adenine, Thymine, Guanine, Cytosine). 우리는 어떤 DNA의 물질을 표현할 때, 이 DNA를 이루는 뉴클레오티드의 첫글자를 따서 표현한다. 만약에 Thymine-Adenine-Adenine-Cytosine-Thymine-Guanine-Cytosine-Cytosine-Guanine-Adenine-Thymine로 이루어진 DNA가 있다고 하면, “TAACTGCCGAT”로 표현할 수 있다. 그리고 Hamming Distance란 길이가 같은 두 DNA가 있을 때, 각 위치의 뉴클오티드 문자가 다른 것의 개수이다. 만약에 “AGCAT"와 ”GGAAT"는 첫 번째 글자와..
2023.03.29
no image
BFS, DFS, 최선우선탐색, 휴리스틱 알고리즘, a* 알고리즘 3X3 8퍼즐 공부
퍼즐 맞추기인데 교수님이 억까 코드로 실습하라고 했음... 그래서 일단 억까코드 수정하고 저렇게 만들어봤는데 bfs는 교수님 원본 코드에서 딱히 바뀐건 없고 주석이랑 조건문 위치랑 moves 프린트 수정했고 dfs는 실습이었는데 저렇게 만드는게 맞나 모르겠다.. 일단 무한적으로 탐색하던건 조건문 위치랑 조건 수정해서 고쳐졌고 set으로 중복체킹하는데 시간복잡도 O(1)로 수정함 BFS class State: def __init__(self, board, goal, moves=0): self.board = board self.moves = moves self.goal = goal # i1과 i2를 교환하여서 새로운 상태를 반환한다. def get_new_board(self, i1, i2, moves): n..
2023.03.26
no image
[백준 1485번 문제, Python3] 정사각형
문제 문제 네 점이 주어졌을 때, 네 점을 이용해 정사각형을 만들 수 있는지 없는지를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 네 줄로 이루어져 있으며, 점의 좌표가 한 줄에 하나씩 주어진다. 점의 좌표는 -100,000보다 크거나 같고, 100,000보다 작거나 같은 정수이다. 같은 점이 두 번 이상 주어지지 않는다. 코드import math class Line: x1, y1, x2, y2 = 0, 0, 0, 0 length = 0 def __init__(self, a, b): self.x1 = a[0] self.y1 = a[1] self.x2 = b[0] self.y2 = b[1] self.length = math.sqrt((self.x1..
2023.03.25
자바 양방향 그래프 dfs - 2차원 행렬, 반복문, 스택, LinkedHashSet
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String[] line = reader.readLine().split("\\s+"); // 7, 8 int vertex = Integer.parseInt(line[0]); // 노드 int edge = Integer.parse..
2023.03.21
no image
운영체제 (1) ~ (3) 주차 학습 노트
운영체제 실체가 있는 소프트웨어 사용자와 하드웨어 사이에서 중계 역할을 하면서, 프로그램의 실행을 관리하고 제어하는 시스템 소프트웨어 컴퓨터의 자원을 독점적으로 관리하는 소프트웨어 운영체제의 속성 컴퓨터 자원 관리 하드웨어 자원 - CPU, 캐시, 메모리, 키보드, 마우스.... 소프트웨어 자원 - 응용프로그램 데이터 자원 - 파일, DB 자원 독점 독점 : 자원에 대한 접근과 관리 권한이 오직 운영체제에 있다는 뜻 (자원 할당, 자원 공유, 자원 액세스, 자원 입출력) 관리자 프로그램 관리, 메모리 관리 소프트웨어 커널(관리 기능을 수행하는 핵심 코드), UI, 도구 프로그램 운영체제 목적과 기능 운영체제의 목적(목표) 사용자의 컴퓨터 사용 편리성 자원의 효율적 사용과 관리 운영체제 기능 CPU/프로세..
2023.03.20
자료구조와 알고리즘 학습 노트 기초 (3) 자료구조 및 알고리즘 리스트
ADT 추상적 자료구조 데이터의 논리적인 모습을 추상화하여 표현하는 자료구조이다. 내부 구현 방법은 숨기고, 데이터가 어떻게 사용될 수 있는지 정의한다. 즉, 데이터의 추상화를 통하여 자료구조의 기능에 집중할 수 있는 개념 리스트, 스택, 큐 등등 배열: 타입이 같은 데이터를 묶는 자료구조 구조체: 타입이 다른 데이터를 묶는 자료구조
2023.03.19
728x90
반응형

문제

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율

 

2 초 128 MB 302070 95671 76555 32.413%

문제

영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

입력

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.

 


코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>    // strlen (문자열 길이 체크용)
#include <ctype.h>    // isspace (공백문자 체크용)

char* trim(char*);

int main() {
	char line[1000000];

    // 입력
	scanf("%[^\n]", line);

    // 문자열 앞, 뒤 공백 제거
    char *line_result = trim(line);

    // trim을 하면 공백을 제거하는데 문자열 길이가 0이면 0 반환
    if (strlen(line_result) == 0) {
        printf("%d\n", 0);
        return 0;
    }
    else {
        // 단어 개수를 저장할 변수
        int answer = 0;

        // 문자열 개수만큼 반복
        for (int i = 0; i < strlen(line_result); i++) {
            // 문자열에서 현재 보고 있는 문자가 공백이면 +1
            if (line_result[i] == ' ') {
                answer++;
            }
        }

        // 공백의 개수를 세었는데 출력은 단어의 개수를 요구하니 +1
        printf("%d\n", answer + 1);
        return 0;
    }
}


char* trim(char* str) {
    // 문자열의 앞쪽 공백 제거
    while (isspace(*str)) {
        str++;
    }

    // 문자열의 뒤쪽 공백 제거
    int len = strlen(str);
    while (len > 0 && isspace(str[len - 1])) {
        str[--len] = '\0';
    }

    return str;
}

해결

앞, 뒤 공백을 제거하고 문장의 중간에 있는 공백의 개수를 센다


참고

링크

 

 

 

728x90
반응형
728x90
반응형

동명사

주어, 목적어, 보어로서 동사 + ing 형태로 사용된다

 

 

동명사의 역할과 동명사 목적어

동명사의 역할

1. 동사 + ing 형태로 to부정사와 함께 준동사에 포함된다

2. 문장 내에서 주어, 동사, 전치사의 목적어, 그리고 보어의 역할을 한다

3. 명사 앞에서 뒤에오는 명사를 수식하는 형용사로 쓰일 수도 있다(명사 뒤에는 사용할 수 없음..?)

 

주어

Smoking is not allowed in the building.

이 건물에서 담배를 피우는 것은 허락되지 않는다.

* 동명사 주어는 항상 3인칭 단수 취급하기 때문에 단수 동사를 쓴다.

 

동사의 목적어

Mr. Jackson suggested having a meeting this week.

Jackson 씨는 이번 주에 회의를 열자고 제안했다.

 

전치사의 목적어 (전치사 + 명사)

We succeeded in solving the difficult problem.

우리는 그 어려운 문제를 푸는 데 성공했다.

 

보어

My job is supervising the local staff.

내가 맡은 일은 현지 직원을 감독하는 것이다.

 

동명사를 목적어로 취하는 동사

* suggest + ing 명사, consider + ing 명사, discontinue + ing 명사,

   avoid + ing 명사, recommend + ing 명사, deny + ing 명사

 

to 부정사와 동명사 모두 목적어로 취하는 동사

* remember, forget, try -> to부정사와 동명사 모두 취할 수 있지만 해석이 달라짐

* to부정사만을 목적어로 취하는 동사

-> want todo, would like todo, hope todo, expect todo, agree todo, decide todo, offer todo, plan todo

 

관용적 동명사 표현

전치사 + 동명사

 

전치사 to + 동명사

 

자주 등장하는 동명사 숙어 표현

 

1. 문제

Young and new companty owners have _______ increasing profits in the first few years.

(a) being difficulty

(b) difficulty

(c) difficult

(d) to be difficult

 

 

 

정답 

 

 

 

b

 

 

 

 

728x90
반응형
728x90
반응형

문제

문제

DNA란 어떤 유전물질을 구성하는 분자이다. 이 DNA는 서로 다른 4가지의 뉴클레오티드로 이루어져 있다(Adenine, Thymine, Guanine, Cytosine). 우리는 어떤 DNA의 물질을 표현할 때, 이 DNA를 이루는 뉴클레오티드의 첫글자를 따서 표현한다. 만약에 Thymine-Adenine-Adenine-Cytosine-Thymine-Guanine-Cytosine-Cytosine-Guanine-Adenine-Thymine로 이루어진 DNA가 있다고 하면, “TAACTGCCGAT”로 표현할 수 있다. 그리고 Hamming Distance란 길이가 같은 두 DNA가 있을 때, 각 위치의 뉴클오티드 문자가 다른 것의 개수이다. 만약에 “AGCAT"와 ”GGAAT"는 첫 번째 글자와 세 번째 글자가 다르므로 Hamming Distance는 2이다.

우리가 할 일은 다음과 같다. N개의 길이 M인 DNA s1, s2, ..., sn가 주어져 있을 때 Hamming Distance의 합이 가장 작은 DNA s를 구하는 것이다. 즉, s와 s1의 Hamming Distance + s와 s2의 Hamming Distance + s와 s3의 Hamming Distance ... 의 합이 최소가 된다는 의미이다.

입력

첫 줄에 DNA의 수 N과 문자열의 길이 M이 주어진다. 그리고 둘째 줄부터 N+1번째 줄까지 N개의 DNA가 주어진다. N은 1,000보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다.

출력

첫째 줄에 Hamming Distance의 합이 가장 작은 DNA 를 출력하고, 둘째 줄에는 그 Hamming Distance의 합을 출력하시오. 그러한 DNA가 여러 개 있을 때에는 사전순으로 가장 앞서는 것을 출력한다.


코드

input_count, input_length = map(int, input().split(' '))    # 첫번째 줄 입력
inputs = [list(input()) for _ in range(input_count)]    # 두번쨰 줄 부터 DNA 입력 받고 리스트에 추가
inputs = list(zip(*inputs))    # 입력 받은 DNA 리스트를 전치함

answer_dna = []
answer_distance = 0

for i, v in enumerate(inputs):
    inputs[i] = sorted(list(v))    # 리스트를 사전순으로 정렬함
    my_dict = dict()    # 키 = 뉴클레오티드 문자, 값 = 빈도수 형태로 딕셔너리를 만들거임

    for j in inputs[i]:
        my_dict[j] = my_dict.get(j, 0) + 1    # 빈도수 체크

    min_dna = max(my_dict, key=my_dict.get)    # 최다 빈도수의 뉴클레오티드의 개수
    answer_dna.append(min_dna)    # 정답 dna 리스트에 추가

    answer_distance = answer_distance + len(inputs[i]) - inputs[i].count(min_dna)    # dna 길이 - 최대 빈도수의 뉴클레오티드 개수

answer_dna = ''.join(answer_dna)    # dna 리스트를 문자열로 변환
print(f'{answer_dna}\n{answer_distance}')

해결

백준 문제 설명이 정말 이해하기가 어려워서 처음부터 문제를 보자면

다음과 같은 dna가 주어지면

각 열들의 행값들을 비교해서 최다 빈도수로 dna 문자열을 만들고 서로 다른 dna 즉 해밍거리를 구해야한다

 

 

세로로 AAAGA 에서 가장 많은 빈도를 가진 문자는 A 그리고 다른 문자는 G 하나 뿐이니 해밍 거리는 1

또한 세로로 AACAG 인경우 가장 많은 빈도를 가진 문자는 A 그리고 다른 문자는 C, G이니 해밍 거리는 2

 

게다가 해밍거리가 같은 경우 사전순으로 DNA 문자열을 만들어야 하기 때문에 정렬을 먼저 해줘야하는데

그냥 정렬하면 행, 열의 순서가 흐트러지므로 전치를 해줘야한다

 

파이썬에서는 전치를 정말 쉽게 zip 메서드를 사용하면 된다


참고

링크

 

 

 

728x90
반응형
728x90
반응형

 

 

퍼즐 맞추기인데

교수님이 억까 코드로 실습하라고 했음...

그래서 일단 억까코드 수정하고 저렇게 만들어봤는데

 

bfs는 교수님 원본 코드에서 딱히 바뀐건 없고

주석이랑 조건문 위치랑 moves 프린트 수정했고

 

dfs는 실습이었는데

저렇게 만드는게 맞나 모르겠다..

일단 무한적으로 탐색하던건 조건문 위치랑 조건 수정해서 고쳐졌고

set으로 중복체킹하는데 시간복잡도 O(1)로 수정함

 

 

 

 

BFS

class State:
    def __init__(self, board, goal, moves=0):
        self.board = board
        self.moves = moves
        self.goal = goal

    # i1과 i2를 교환하여서 새로운 상태를 반환한다.
    def get_new_board(self, i1, i2, moves):
        new_board = self.board[:]
        new_board[i1], new_board[i2] = new_board[i2], new_board[i1]
        return State(new_board, self.goal, moves)

    def expand(self, moves):
        result = []
        i = self.board.index(0)  # 숫자 0(빈칸)의 위치를 찾는다.
        if not i in [0, 1, 2]:  # UP 연산자
            result.append(self.get_new_board(i, i - 3, moves))
        if not i in [0, 3, 6]:  # LEFT 연산자
            result.append(self.get_new_board(i, i - 1, moves))
        if not i in [2, 5, 8]:  # DOWN 연산자 -> 사실 RIGHT 연산자로 추정
            result.append(self.get_new_board(i, i + 1, moves))
        if not i in [6, 7, 8]:  # RIGHT 연산자 -> 사실 DOWN 연산자로 추정
            result.append(self.get_new_board(i, i + 3, moves))
        return result

    # 객체를 출력할 때 사용한다.
    def __str__(self):
        return str(self.board[:3]) + "\n" + \
            str(self.board[3:6]) + "\n" + \
            str(self.board[6:]) + "\n" + \
            "------------------"

    def __eq__(self, other):
        return self.board == other.board


if __name__ == "__main__":
    puzzle = [2, 8, 3,
              1, 6, 4,
              7, 0, 5]

    goal = [1, 2, 3,
            8, 0, 4,
            7, 6, 5]

    # open 리스트
    not_visited = [State(puzzle, goal)]
    visited = []
    moves = 0
    while not_visited:  # 스택이 빌 때까지
        current = not_visited.pop(0)  # 방문하려는 노드를 not_visited에서 삭제
        print(current, current.moves)
        if current.board == goal:
            print("탐색 성공")
            break

        if current not in visited:
            visited.append(current)
            moves = current.moves + 1
            for state in current.expand(moves):
                if state in visited:  # 이미 거쳐간 노드이면
                    continue  # 노드를 버린다.
                else:
                    not_visited.append(state)  # 리스트 추가

 

 

DFS

class State:
    def __init__(self, board, goal, moves=0):
        self.board = board
        self.moves = moves
        self.goal = goal

    # i1과 i2를 교환하여서 새로운 상태를 반환한다.
    def get_new_board(self, i1, i2, moves):
        new_board = self.board[:]
        new_board[i1], new_board[i2] = new_board[i2], new_board[i1]
        return State(new_board, self.goal, moves)

    def expand(self, moves):
        result = []
        i = self.board.index(0)  # 숫자 0(빈칸)의 위치를 찾는다.
        if not i in [0, 1, 2]:  # UP 연산자
            result.append(self.get_new_board(i, i - 3, moves))
        if not i in [0, 3, 6]:  # LEFT 연산자
            result.append(self.get_new_board(i, i - 1, moves))
        if not i in [2, 5, 8]:  # DOWN 연산자 -> 사실 RIGHT 연산자로 추정
            result.append(self.get_new_board(i, i + 1, moves))
        if not i in [6, 7, 8]:  # RIGHT 연산자 -> 사실 DOWN 연산자로 추정
            result.append(self.get_new_board(i, i + 3, moves))
        return result

    # 객체를 출력할 때 사용한다.
    def __str__(self):
        return str(self.board[:3]) + "\n" + \
            str(self.board[3:6]) + "\n" + \
            str(self.board[6:]) + "\n" + \
            "------------------"

    def __eq__(self, other):
        return self.board == other.board

    def __hash__(self):
        return hash((tuple(self.board)))


if __name__ == "__main__":
    puzzle = [2, 8, 3,
              1, 6, 4,
              7, 0, 5]

    goal = [1, 2, 3,
            8, 0, 4,
            7, 6, 5]

    # open 리스트
    not_visited = [State(puzzle, goal)]
    visited_set = set()
    moves = 0
    while not_visited:  # 스택이 빌 때까지
        current = not_visited.pop()  # 방문하려는 노드를 not_visited에서 삭제
        print(current, current.moves)
        if current.board == goal:
            print("탐색 성공")
            break

        if current not in visited_set:
            visited_set.add(current)
            moves = current.moves + 1

            for state in current.expand(moves):
                if state not in visited_set:  # 이미 거쳐간 노드가 아니면
                    not_visited.append(state)  # 리스트 추가

 

DFS는 노드간의 간선을 미리 설정해놓지 않는 무정보탐색에서는

이렇게 정말 많은 반복을 하는것같음

 

그래서 dfs는 set 클래스로 시간복잡도를 개선했는데

뭔 2천번 넘게 탐색을해서 저렇게 수정하는게 맞나 모르겠음

 

암튼 bfs도 set 클래스를 써도 되는데 코드 차이를 보라고 저렇게 해봤음

 

 

Best-First Search (그리디 알고리즘) + a* 알고리즘

class State:
    def __init__(self, board, goal, moves=0):
        self.board = board
        self.moves = moves
        self.goal = goal

    # i1과 i2를 교환하여서 새로운 상태를 반환한다.
    def get_new_board(self, i1, i2, moves):
        new_board = self.board[:]
        new_board[i1], new_board[i2] = new_board[i2], new_board[i1]
        return State(new_board, self.goal, moves)

    def expand(self, moves):
        result = []
        i = self.board.index(0)  # 숫자 0(빈칸)의 위치를 찾는다.
        if not i in [0, 1, 2]:  # UP 연산자
            result.append(self.get_new_board(i, i - 3, moves))
        if not i in [0, 3, 6]:  # LEFT 연산자
            result.append(self.get_new_board(i, i - 1, moves))
        if not i in [2, 5, 8]:  # DOWN 연산자 -> 사실 RIGHT 연산자로 추정
            result.append(self.get_new_board(i, i + 1, moves))
        if not i in [6, 7, 8]:  # RIGHT 연산자 -> 사실 DOWN 연산자로 추정
            result.append(self.get_new_board(i, i + 3, moves))
        return result

    # 객체를 출력할 때 사용한다.
    def __str__(self):
        return str(self.board[:3]) + "\n" + \
            str(self.board[3:6]) + "\n" + \
            str(self.board[6:]) + "\n" + \
            "------------------"

    def __eq__(self, other):
        return self.board == other.board

    def __hash__(self):
        return hash((tuple(self.board)))

    def f(self):
        return self.g() + self.h()

    def g(self):
        return self.moves

    def h(self):
        return sum([1 if self.board[i] != self.goal[i] else 0 for i in range(8)])

    def __lt__(self, other):
        return self.f() < other.f()



puzzle = [2, 8, 3,
              1, 6, 4,
              7, 0, 5]

goal = [1, 2, 3,
        8, 0, 4,
        7, 6, 5]

# open 리스트
not_visited = [State(puzzle, goal)]
visited_set = set()
moves = 0
while not_visited:  # 스택이 빌 때까지

    current = min(not_visited) # 가장 휴리스틱 값이 최적인 것을 현재 노드로 선택
    not_visited.remove(current)
    print(current, current.moves)
    if current.board == goal:
        print("탐색 성공")
        break

    if current not in visited_set:
        visited_set.add(current)
        moves = current.moves + 1

        for state in current.expand(moves):
            if state not in visited_set:  # 이미 거쳐간 노드가 아니면
                state.f_value = state.f()
                not_visited.append(state)  # 리스트 추가

 

휴리스틱 값을 퍼즐이 골의 퍼즐과 다른 상태를 h() 시작 노드에서 현재 노드까지 거리를 g() 으로 합쳐서

최선탐색 알고리즘과 a스타 알고리즘으로 작성했다 그런데 정확하게 아직은 모르겠다

아직 가장 최적으로 찾는게 없어서 나중에 수정해야한다

 

 

 

728x90
반응형
728x90
반응형

문제

문제

네 점이 주어졌을 때, 네 점을 이용해 정사각형을 만들 수 있는지 없는지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 네 줄로 이루어져 있으며, 점의 좌표가 한 줄에 하나씩 주어진다. 점의 좌표는 -100,000보다 크거나 같고, 100,000보다 작거나 같은 정수이다. 같은 점이 두 번 이상 주어지지 않는다.


코드

import math


class Line:
    x1, y1, x2, y2 = 0, 0, 0, 0
    length = 0

    def __init__(self, a, b):
        self.x1 = a[0]
        self.y1 = a[1]
        self.x2 = b[0]
        self.y2 = b[1]
        self.length = math.sqrt((self.x1 - self.x2) ** 2 + (self.y1 - self.y2) ** 2)    # d = √((x2-x1)² + (y2-y1)²)

    def __lt__(self, other):
        return self.length < other.length    # 비교를 위한 메서드 재정의

    def slope(self):
        return (self.y2 - self.y1) / (self.x2 - self.x1)    # 기울기 반환 메서드


count = int(input())
input_list = []
for i in range(count * 4):
    tmp = list(map(int, input().split(" ")))
    input_list.append(tmp)  # input_list = [[1, 1], [1, 2], [2, 1], [2, 2], [2, 2], [3, 3], [4, 4], [5, 5]]

for i in range(0, count):
    tmp = input_list[i * 4:(i + 1) * 4]  # [[1, 1], [1, 2], [2, 1], [2, 2]] 각 점을 저장하는 리스트
    tmp2 = []    # 각 점을 이은 선분을 저장하는 리스트
    for index, value in enumerate(tmp):
        for k in range(index + 1, len(tmp)):
            tmp2.append(Line(value, tmp[k]))

    tmp2 = sorted(tmp2, reverse=True)  # 무조건 tmp2[0], tmp2[1] 대각선 객체

    # 대각선으로 정사각형인지 체크
    try:
        # 두 선분이 교차하는 각을 계산해야함
        # 그러나 두 선분의 기울기를 빼면 0이 나올 때가 있음
        theta = math.degrees(
            math.atan(abs((tmp2[1].slope() - tmp2[0].slope()) / (1 + tmp2[0].slope() * tmp2[1].slope()))))
        if theta == 90:    # 만약 두 선분이 교차하는 각이 90도이면 정사각형이다
            print(1)
        else:
            print(0)

    except:    # 두 점의 기울기가 같은 경우 ZeroDivisionError 에러가 생긴다
        if tmp2[1].length == tmp2[0].length:
            print(1)    # 두 선분의 절대값 기울기가 같은 경우 수직선이다. 이 때 두 선분의 길이가 같으면 정사각형.
        else:
            print(0)

해결

각 점이 있으면 두 점의 길이를 각각 구하고 큰 순서대로 정렬하면 가장 앞과 두번째가 대각선 길이가 될것이다
두 대각선이 교차하는 각이 90도이면 정사각형이라고 생각해서 저렇게 풀었다
 

# 두 직선이 이루는 각 계산
theta = math.degrees(math.atan(abs((m2-m1)/(1+m1*m2))))

 
두 직선이 이루는 각은 위 공식으로 구하는데
0을 나누는 경우가 생긴다 그래서 예외 처리를하고 길이가 같으면 1로 처리한다


참고

https://kldp.org/node/126284

정사각형 판별 문제입니다. | KLDP

네개의 점(w,x,y,z)의 좌표(x,y)가 주어졌을 때, 이 점들을 이은 도형이 정사각형인지 판펼하는 소스를 C언어로 작성하라는 문제인데.... 아 생각보다 엄청 어렵네요;; 정사각형의 수학적 정의, 4변이

kldp.org

 
 
 

728x90
반응형
728x90
반응형
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String[] line = reader.readLine().split("\\s+");    // 7, 8
        int vertex = Integer.parseInt(line[0]);    // 노드
        int edge = Integer.parseInt(line[1]);    // 간선

        int[][] adjMatrix = new int[vertex + 1][vertex + 1];
        for (int[] matrix : adjMatrix) {
            Arrays.fill(matrix, 0);    // 2차원 행렬 초기화
        }

        for (int i = 0; i < edge; i++) {
            line = reader.readLine().split("\\s+");

            /*
            1 2
            1 3
            2 4
            2 5
            4 6
            5 6
            6 7
            3 7
            */

            int start = Integer.parseInt(line[0]);
            int end = Integer.parseInt(line[1]);
            adjMatrix[start][end] = 1;
            adjMatrix[end][start] = 1;    // 양방향 그래프
        }

        Stack<Integer> stack = new Stack<>();    // 현재 진행중인 스택
        stack.add(1);    // 처음 시작할 순서
        Set<Integer> visited = new LinkedHashSet<>();    // 방문했던 노드를 저장할 Set, 순서대로 출력할것이기에 LinkedHashSet 사용

        while (!stack.isEmpty()) {
            int current = stack.pop();
            visited.add(current);    // 노드를 방문했다고 추가

            for (int i = 0; i < vertex + 1; i++) {
                if (adjMatrix[current][i] == 1 && !visited.contains(i)) {
                    stack.add(i);    // 이어져있고 방문하지 않았으면 스택에 추가
                }
            }
        }

        for (Integer i : visited) {
            System.out.print(i + " ");    // 1 3 7 6 5 2 4 
        }
    }
}
728x90
반응형
728x90
반응형

운영체제

실체가 있는 소프트웨어

사용자하드웨어 사이에서 중계 역할을 하면서, 프로그램의 실행관리하고 제어하는 시스템 소프트웨어

컴퓨터의 자원독점적으로 관리하는 소프트웨어

 

운영체제의 속성

컴퓨터 자원 관리

  • 하드웨어 자원 - CPU, 캐시, 메모리, 키보드, 마우스....
  • 소프트웨어 자원 - 응용프로그램
  • 데이터 자원 - 파일, DB

 

자원 독점

독점 : 자원에 대한 접근과 관리 권한이 오직 운영체제에 있다는 뜻

(자원 할당, 자원 공유, 자원 액세스, 자원 입출력)

 

관리자

프로그램 관리, 메모리 관리

 

소프트웨어

커널(관리 기능을 수행하는 핵심 코드), UI, 도구 프로그램

 

운영체제 목적과 기능

운영체제의 목적(목표)

  • 사용자의 컴퓨터 사용 편리성
  • 자원의 효율적 사용과 관리

 

운영체제 기능

  • CPU/프로세스 관리 (프로세스 적재, 프로세스 실행)
  • 메모리 관리
  • 파일 시스템 관리 (디스크의 빈 영역 등 저장 장치 관리)
  • 장치 관리
  • 네트워크 관리
  • 보안 관리
  • 기타 관리 (부팅, 통계 수집, 정보 관리...)

 

운영체제의 태동

과거

프로그램을 기계에 고착화

전선 등등

고정 프로그램 컴퓨터 <= 한 개의 프로그램을 하드웨어로 고착화 시키는 완전한 하드와이어드 프로그래밍

 

발달

폰노이만의 내장 프로그램 컴퓨터

 

내장 프로그램 컴퓨터

컴퓨터의 구조를 CPU, 메모리로 나누고 명령 코드들을 메모리에 적재하여 실행

 

 

  • 컴퓨터 구조에서 CPU와 메모리 분리
  • 하드웨어와 소프트웨어 개념 분리
  • 실행할 프로그램은 메모리에 담고, CPU가 프로그램을 실행
  • 프로그램은 입력 장치를 통해 메모리에 적재

 

원시 운영체제

로더

목적 프로그램을 읽어 들이는 코드

 

GM OS

1. 컨트롤 패널에서 테이프 장치에 저장된 로더 프로그램을 메모리에 적재시키고 실행

2. 로더 프로그램은 사용자 프로그램을 메모리에 적재

3. CPU가 사용자 프로그램을 실행

 

GM-NAA

오늘날 일종의 배치 운영체제

1. 어셈블러 코드 : 사용자가 작성한 어셈블리어 프로그램을 기계어 코드로 번역

2. 로더 프로그램 : 사용자 프로그램을 메모리에 적재

3. 공통 입출력 코드 및 메인 코드 : 장치 입출력을 다루는 프로그램 코드와 운영체제 시작 코드

 

배치 운영체제

개발자와 관리자가 구분

배치 : 개발자가 작성한 펀치카드의 묶음이며 배치 작업을 줄여 부르는 말

배치가 하나의 프로그램

 

배치처리의 특징

  • 여러 배치 작업들을 모아서 한꺼번에 실행하되 한 번에 한 개씩 순차적으로 실행한다
  • 비대화식이다
  • 프린터에 결과를 출력한다
  • 작업을 요청한 한참 뒤에 결과를 받는다

 

다중 프로그래밍 운영체제

I/O -> CPU 대기 -> CPU 활용율 증가 -> 처리율 증가

CPU의 노는 시간을 최대한 줄여야 했다 (처리율)

 

다중 프로그래밍 기법

여러 프로그램을 메모리에 올려놓고 동시에 실행시키는 기법

CPU가 한 프로그램을 실행하다 I/O가 발행하면 입출력이 완료될 때까지 CPU가 메모리에 적재된 다른 프로그램을 실행하여 CPU의 노는 시간을 줄인다 -> CPU 활용률 극대화

 

 

다중프로그래밍 : 여러 개의 프로그램을 동시에 실행시키는 기법

 

배치 운영체제와 다중프로그래밍 운영체제의 실행 비교?

다중프로그래밍 운영체제는 여러개의 프로그램을 동시에 실행시키기 때문에 CPU 활용률과 처리율이 높다

 

다중 프로그래밍 도입으로 인한 이슈

  • 큰 메모리 이슈
  • 프로그램의 메모리 할당 및 관리 이슈
  • 메모리 보호
  • CPU 스케쥴링과 컨텍스트 스위치이
  • 인터럽트
  • 동기화
  • 교착상태 (무한정 대기)

 

시분할 다중프로그래밍 운영체제

여러 프로그램을 시간 단위로 나누어 번갈아 실행시키는 기법

  • 비대화식 처리방식
  • 느린 응답, 대기 시간

발전

빠른 응답을 제공, 대화식 운영체제 제안

라운드 로빈 : 시분할 운영체제에서 각 프로그램에게 동일한 시간 할당량만큼씩 번갈아 실행시키는 스케쥴링 기법

 

시분할 운영체제는 여러 개의 프로그램을 메모리에 적재하고 시간할당량을 정하여 시간할당량 만큼 메모리에 적재된 모든 프로그램을 돌아가면서 CPU를 할당하고 실행시킨다

 

개인용 운영체제

 

임베디드 운영체제

리눅스 등등

 

 

컴퓨터 시스템과 운영체제

1. 사용자는 응용프로그램이나 운영체제 패키지에 포함된 GUI와 도구 프로그램을 통해 컴퓨터를 활용한다

2. 하드웨어들은 모두 운영체제의 배타적이고 독점적인 지배를 받는다

3. 반드시 운영체제를 통해서만 접근가능하다

 

CPU

메모리에 적재된 프로그램을 실행한다

메모리

프로그램은 실행되기 위해 반드시 메모리에 적재되어야한다

캐시 메모리

프로그램 실행 속도를 높이기 위해 사용한다

버스

주소버스 - 주소 신호

데이터 버스

제어 버스

 

레지스터들에 대한 주소

주소 버스는 주소 값이 전달되는 여러 선의 다발을 부르는 용어

시스템 버스, 입출력 버스

입출력 제어 장치 및 시스템 제어 회로

CPU와 입출력 장치 사이에 데이터가 전달되도록 중계하는 역할

DMAC : 입출력 장치와 메모리 사이 데이터 전송에 CPU 개입 없이 직접 전송

 

CPU와 메모리 관계

32비트 CPU

32개의 주소선을 가진 CPU가 액세스할 수 있는 주소의 범위

2^32개의 서로 다른 주소, 0 ~ 2^32 - 1 번지

2^32 바이트 = 4GB

그러므로 32 비트 CPU에서의 메모리 최대 크기는 4GB

 

CPU

CPU 명령 사이클 : CPU가 한 개의 명령을 처리하는 세부 과정

 

PC(Program Counter) - 실행할 명령의 메모리 주소를 저장하는 레지스터

IR(Instruction Register) -  실행을 위해 메모리에서 읽어온 명령이 저장되는 레지스터

SP(Stack Pointer) - 스택 영역의 꼭대기 메모리 주소를 저장하는 레지스터

 

스택

  • 코드 공간 - 프로그램 코드가 적재되는 메모리 공간
  • 데이터 공간 - 전역 변수가 적재되는 공간
  • 힙 공간 - 프로그램이 실행 중 동적으로 저장할 데이터를 위한 공간
  • 스택 공간 - 함수가 호출될 때 매개 변수나 지역 변수, 함수가 실행을 마치고 돌아갈 주소등을 저장하는 공간

컨텍스트

프로그램이 실행중인 일체의 상황을 정의

현재 실행중인 프로그램의 컨텍스트를 통해 현재 CPU에 들어있는 레지스터들의 값들로 축소하여 정의할 수 있다

 

컨텍스트 스위칭 : 운영체제가 실행중인 프로그램 A 컨텍스트를 저장해두고 다른 프로그램 B를 실행 시키기 위해 프로그램 B의 저장된 컨텍스트를 CPU로 옮기는 것

 

컴퓨터 시스템의 계층 구조

 

운영체제와 사용자의 관계

사용자에게 컴퓨터 시스템을 사용할 편리한 사용자 인터페이스를 제공한다

하드웨어를 제어하는 것은 전적으로 운영체제의 몫

 

운영체제의 필요성

  • 자원 충돌해결
  • 성능 최적화
  • 사용자 시스템 사용 효율화

 

운영체제 기능

  • 프로세스와 스레드 관리
  • 메모리(가상 메모리) 관리
  • 파일 관리 혹은 파일 시스템 관리
  • 장치 관리
  • 사용자 인터페이스
  • 네트워킹

 

운영체제와 커널

운영체제는 도구/GUI 소프트웨어, 커널, 디바이스 드라이버들로 구성되는 소프트웨어다

 

도구/GUI 소프트웨어

 

커널

커널은 부팅 후부터 메모리에 상주 하고, CPU, 캐시, 메모리 등 하드웨어를 관리하고 프로세서의 실행과 중단, 파일 관리 등핵심적인 기능의 집합

  • 프로세스와 스레드 관리
  • 메모리 관리
  • 파일 생성, 삭제, 파일 입출력 등 파일 및 파일 시스템 관리
  • 디바이스 드라이버를 호출하여 장치 입출력

커널 코드는 함수의 형태로 존재한다

응용프로그램은 함수 호출 방식을 통해서 사용한다.

함수 호출은 응용프로그램에서 커널에 접근할 수 없다

시스템 호출 방식은 응용프로그램에서 커널의 함수를 호출하는 방법이다

 

운영체제 커널 인터페이스 : 시스템 호출과 인터럽트

  • 시스템 호출 - 커널과 응용프로그램 사이의 인터페이스
  • 인터럽트 - 커널과 하드웨어 장치 사이의 인터페이스

 

시스템 호출

응용프로그램에서 커널코드를 실행하는 기법

표준 라이브러리, 시스템 호출 라이브러리로 나뉜다

 

커널 시스템 호출

응용프로그램의 자원 접근 문제

응용프로그램이 컴퓨터 자원에 직접 접근하면 생기는 문제

  • 다른 응용프로그램이 적재된 메모리를 훼손가능
  • 다른 응용프로그램이 생성한 파일을 삭제하거나 실행을 훼손
  • 응용프로그램이 운영체제 커널이 적재된 메모리를 액세스 해서 커널의 주요 데이터를 훼손
  • 컴퓨터 시스템 복구 불능

 

사용자 공간, 커널공간 그리고 사용자 모드, 커널 모드로 나눔

이유는?

응용프로그램으로부터 커널 코드와 데이터를 지키기 위해

 

응용프로그램의 자원 접근 불허 -> 자원에 대한 모든 접근은 커널에만 부여

 

사용자 공간과 커널 공간은 가상의 주소 공간

매핑 테이블

 

CPU 사용자 모드와 커널 모드

사용자모드

CPU는 사용자 모드에서 특권 명령으로 불리는 기계 명령들을 실행할 수 없다.

특권 명령 : 입출력 장치나 타이머, 인터럽트 처리, 시스템 중단 등 CPU 기계 명령어

 

커널모드

CPU는 커널모드에서 모든 메모리 공간을 액세스할 수 있고 특권 명령을 실행할 수 있으며 어떤 하드웨어든지 접근하고 제어할 수 있다

 

사용자 모드에서 커널 모드로 전환 경우

1. 시스템 호출

시스템 호출을 일으키는 명령어가 실행 -> CPU는 사용자 모드에서 커널 모드로 변경

CPU 기계 명령에 의해 사용자 모드로 바꿈

 

2. 인터럽트 발생

CPU는 자동으로 커널 모드로 바뀌고 인터럽트 서비스 루틴을 실행한다

 

커널 모드로 바뀌는 이유 : 인터럽트 서비스 루틴이 커널 공간에 있기 때문

 

특권 명령 : 컨텍스트 스위칭, 인터럽트 금지

 

 

 

 

 

 

 

 

 

 

 

 

 

운영체제와 인터럽트

인터럽트 : 장치 입출력 장치나 젖아장치들이 운영체제와 대화하기 위한 방법

 

 

 

 

 

 

 

728x90
반응형
728x90
반응형

ADT 추상적 자료구조

데이터의 논리적인 모습을 추상화하여 표현하는 자료구조이다. 내부 구현 방법은 숨기고, 데이터가 어떻게 사용될 수 있는지 정의한다. 즉, 데이터의 추상화를 통하여 자료구조의 기능에 집중할 수 있는 개념

리스트, 스택, 큐 등등

 

배열: 타입이 같은 데이터를 묶는 자료구조

구조체: 타입이 다른 데이터를 묶는 자료구조

 

 

728x90
반응형