no image
토익 600 ~ 700 기초 학습 노트 (2) 시제
현재시제 be 동사는 am/are/is 1인칭, 2인칭 일 때 일반 동사는 동사 원형이 사용되나 3인칭인 경우 -s(es)를 붙여서 표현한다. usually, normally 현재시제 보통 *시간, 조건의 부사절 (when, after, if) -> 현재시제 대신 미래시제를 쓴다 When Mr. Calvert retires, a new marketing director will be appointed. retires -> will retire [o] Calvert 씨가 은퇴할 때, 새 마케팅 책임자가 임명될 것이다. 과거시제 & 미래시제 be동사는 was/were를 쓰고, 일반동사는 -ed를 붙이거나 불규칙 과거동사를 쓴다. 미래시제는 will이나 be going to 뒤에 동사원형을 써서 표현한다. (..
2023.03.05
no image
[백준 1000번 문제, JAVA] 네 번째 점
문제 세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오. 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Main { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); Li..
2023.03.05
토익 600 ~ 700 기초 학습 노트 (1) 주어와 동사
주어 주어 자리에는 명사/대명사/to부정사/동명사/명사절 등등이 올 수 있다. 명사 주어 Applications shuld be received no later than this Monday. 지원서는 늦어도 이번 일요일 까지는 접수되어야 한다. 대명사 주어 You are not supposed to use a cell phone during the meeting. 당신은 미팅 중에는 휴대폰을 사용할 수 없다. 명사구 주어 A protective helmet should be worn at all times. (형용사 + 명사) 보호 헬멧은 항상 착용해야 한다. People in the lobby are visiting from Celta Consulting Group. (명사 + 전치사구) 로비에 있는..
2023.03.04
no image
파이썬 학습 노트 기초 (1)
파이썬의 연산자 연산자 뜻 + 더하기 - 빼기 * 곱하기 / 나누기(소수점) ** 제곱 // 몫 % 나머지 () 괄호 안을 먼저 연산 파이썬의 변수 변수 이름 뒤 등호(=)로 값을 저장한다 C언어나 JAVA 처럼 자료형을 지정해주지 않는다 변수 이름은 대/소문자, 숫자, 밑줄로 사용 대소문자는 구분됨 파이썬의 변수 네이밍룰은 소문자로 _ 를 사용하여 구분하여 사용한다고 한다 출력 print(변수), print("hello") def print_hi(name): print("I like", end='') print(" money") if __name__ == '__main__': print_hi('PyCharm') 판단 파이썬의 참 값은 True, 거짓 없은 False ==, !=, , = 와 같은 비교 ..
2023.03.04
no image
[백준 1100번 문제, JAVA] 하얀 칸
문제 체스판은 8×8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램을 작성하시오. 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new..
2023.03.04
no image
자료구조와 알고리즘 학습 노트 기초 (1) 자료구조와 알고리즘
자료구조 데이터를 저장, 조직, 관리하는 방법 책들이 난잡하게 어질러져있음 -> 책을 카테고리에 맞게 분류 자료구조의 일상 생활과 프로그래밍 문제 해결과의 차이 건축물을 만들려면 : 건축 재료(철근, 시멘트, 벽돌)의 이해가 필요. 샤시, 철골, 인터넷 연결 구조 프로그래밍 : 데이터 구조와 모듈의 이해가 필요. 리스트, 스택, 트리 구조 즉 상황에 맞게 어떤 자료구조를 사용할지 판단해야함 자료구조의 종류 배열, 리스트, 스택, 큐, 그래프, 트리, 최대 힙, 행렬.... 선형 자료구조 :리스트, 스택, 큐 색인 자료구조 :검색트리(이진 검색트리, 균형 검색 트리), 해시 테이블 효율적인 자료구조 :우선순위 큐: 힙 관계 처리 자료구조 :그래프 알고리즘 문제 해결 과정을 묘사하는 것 문제 해결 절차를 체..
2023.03.04
윤년 구하는 함수
static boolean isLeapYear(int year) { return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); } c/c++ 이면 boolean 대신에 int를 쓰면 됨
2023.03.03
no image
[백준 1094번 문제, JAVA] 막대기
문제 지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다. 막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다. 지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이때, 합이 X보다 크다면, 아래와 같은 과정을 반복한다. 가지고 있는 막대 중 길이가 가장 짧은 것을 절반으로 자른다. 만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다. 이제, ..
2023.03.03
728x90
반응형

현재시제

be 동사는 am/are/is 1인칭, 2인칭 일 때 일반 동사는 동사 원형이 사용되나 3인칭인 경우 -s(es)를 붙여서 표현한다.

usually, normally 현재시제 보통

 

*시간, 조건의 부사절 (when, after, if) -> 현재시제 대신 미래시제를 쓴다

When Mr. Calvert retires, a new marketing director will be appointed.

retires -> will retire [o]

Calvert 씨가 은퇴할 때, 새 마케팅 책임자가 임명될 것이다.

 

과거시제 & 미래시제

be동사는 was/were를 쓰고, 일반동사는 -ed를 붙이거나 불규칙 과거동사를 쓴다.

미래시제는 will이나 be going to 뒤에 동사원형을 써서 표현한다. (soon, shortly)

 

Mr.Jang called to ask about the contract yesterday.

Jang씨는 어제 계약에 관해 질문하기 위하여 전화했다.

 

The manufacturing conference will begin at 11 A.M. tomorrow.

제조 컨퍼런스는 내일 아침 11시에 시작할 것이다.

 

The vice president is going to make an announcemnet this afternoon.

부사장님은 오늘 오후에 발표를 할 것이다.

 

* 과거: last, past, ago

 

완료시제

현재완료, 과거완료, 미래완료로 구분

 

현재완료

과거는 명확한 과거시점을 강조하지만, 현재완료는 과거에 일어난 일이지만, 현재와 관련성이 있을 때 사용한다.

have/has + p.p

 

Mr Parker has never experienced failure in business. (경험)

Parker 씨는 사업에서 실패를 경험해 본 적이 없다.

 

The results of the customer survey have just come out. (완료)

고객 설문 결과가 지금 막 나왔다.

 

Ms. Davis has worked for Fullham Co. for over 25 years. (계속)

Davis 씨는 25년 이상 Fullham 사를 위해 일해왔다

 

Ms. Davis has worked for Fullham Co. since she was 30 years old.

Davis 씨는 서른 살부터 Fullham 사를 위해 일해왔다

* since 뒤에는 과거시제 , since 앞에는 현재완료 시제를 쓴다
* S have/has p.p (since, over, for, in) the (past, last) 

 

The secretary has gone out for a quick launch (결과)

그 비서는 간단한 점심식사를 위해 나가고 없다.

 

* 명확한 과거표현과 현재완료시제는 함께 쓰일 수 없다. 단순 과거시제를 사용해야한다.
(ago, past, last, yesterday)
* 현재 완료와 함께 쓰이는 부사 표현
(before : 전에, recently/lately : 최근에, since : 이래로, ever : 지금까지 한번이라도)
* recently : 과거, 현재완료 가능, lately : 현재완료 가능

 

현재완료 진행

과거의 동작이 현재까지 계속되는 때

have/has been + -ing

 

The clients have been waiting in the meeting room for over 30 minutes.

고객들은 회의실에서 30분 넘게 기다리고 있다

* work, learn, study와 같은 동사는 현재완료와 현재완료 진행형의 의미 차이가 거의 없다
* They have been working ~~ == The have worked ~~~
* (over, for, in) the (last, past)

 

과거완료, 미래완료

과거완료는 대과거라고도 부른다. 과거보다 더 과거의 일을 표현한다

had + p.p

 

When Ms. Hill got back from her business trip, her boss had quit the company.

Hill 씨가 출장에서 돌아왔을 때, 그녀의 상사는 회사를 그만두고 없었다.

 

미래완료는 미래 특정시점 이전에 완려되는 일을 표현한다

will have + p.p

 

By the time Mr. Rogers arrives at the airport, his flight will have already taken off.

Rogers 씨가 공항에 도착할 때 즈음에 그의 비행기는 이미 이륙하고 난 뒤일 것이다.

* by the time (접속사: ~할 때쯤)과 자주 사용된다.

 

연습문제

1. The Prince Corporation _____ the top chemical supplier for the last 10 years.

(a) was

(b) has been

(c) had been

(d) will have been

 

정답

 

(b)

 

Prince Corporation은 지난 10년 동안 최고의 화학 공급업체였습니다.

 

 

2. Mr. Miller's books have never received great reviews from critics____they were published.

 

(a) as

(b) for

(c) since

(d) during

 

정답

 

(c)

 

나는 이 문제에서 생각보다 많은 것을 알게 되었다

일단 인강 선생님이 말씀하시는 것은 they 주어가 있기 때문에 접속사로 문장을 이어줘야 하기 때문에

during, for는 전치사이기 때문에 자동 탈락이라고 하셨다

 

먼저 전부 이해하기 전에는 이것이 제일 이해가 안되었다

내가 알기에 전치사는 명사, 대명사와 함께 하며 접속사로 쓰일 수 있다고 배웠다

전치사에는 on, in, at, by, with, for 등이 있으며 전치사 + 명사/대명사로 접속사로 쓰일 수 있었는데

 

사실 전치사가 접속사로 쓰이는 전치사는 따로 있었다는 것!

ex. "since", "after", "before", "until", "unless", "except", "besides", "along with", "together with", "in addition to" 등등

기본적으로 since, after, before 가 가장 많이 쓰이며 나머지는 정말 특수한 경우 쓰인다고 한다

 

그렇다 문장이 주어 동사 + 주어 동사로 이어져있기 때문에 접속사가 필요한데

내가 since와 during중에 정말 고민했는데 during은 아니었던 것

 

그러면 보기의 접속사 as, since중에 현재완료와 어울리는 것은 since

 

3. The researchers ____ hard to develop a perfect new model over the last 2 years.

 

(a) work

(b) worked

(c) are working

(d) have been working

 

정답 

 

(d)

 

솔직히 나는 이거 b도 답이 맞다고 생각하는데 진짜 토익에서는 이런 문제가 나오지 않겠지만 진짜 문제 더럽다

왜냐면 일단 정답대로 해석하면 "연구원들은 지난 2년간 완벽한 새 모델을 개발하기 위해 노력해왔습니다"가 되는데

군더더기 없이 완벽한 해석이며 완벽한 문법이다 그런데 have been working을 worked로 바꾸면 어떻게 해석되는가

"연구원들은 지난 2년간 완벽한 새 모델을 개발하기 위해 노력했습니다"가 된다 정말 완벽한 문법 아닌가?

단지 과거와 현재완료의 차이일 뿐인데... 겨우 이 차이 때문에 어떤것이 정답이 되고 어떤것이 오답이 되는 문제

진짜 더럽다고 생각합니다

 

 

챗gpt도 완전히 올바른 문장이라고 말하고 있다.....

 

 

그래서 두 개의 문장 중에 어떤 것이 더 올바른 문장인지 골라보라고 했다

결론은 인공지능도 맥락을 보고 골라야한다고 생각하며 고를 수 없다고 한다...

인공지능도 못고르는 문제를 인간이 뭐라고 정답이라고 정하지? 

 

4. Market research at Anderson, Inc. ____ the design of its products last quarter.

(a) improves

(b) improved

(c) is improving

(d) has improved

 

정답 

 

(d)

 

이건 확실하게 b번인것이 last quarter가 확실한 과거시제 (지난 분기)라고 했기 때문에 과거시제를 쓰는 것이 맞다

 

 

다음 문제를 푸기위해서는 능동태, 수동태를 알아야한다

인강 선생님이 간단하게 알려줬는데

능동태 ~를 하다 형태이며  능동태를 가진 문장은 주어 동사 목적 형태의 문장이된

수동태 ~를 되다 형태이며 수동태 다음에는 목적어가 없다

 

5. Sunset Co. ____ another branch office in Florida in the near future.

(a) opened

(b) had opended

(c) will be opened

(d) is going to open

 

 

정답 

 

(d)

 

Sunset Co. 는 주어, ____ 동사, another branch office 목적어

s v o 형태의 능동태가 되어야 한다

v가 수동태가 오면 다음에 목적어가 오면 안되는데 목적어가 왔기 때문에 수동태가 되어야한다

 

 

728x90
반응형
728x90
반응형

문제

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        List<Point> pointList = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            String[] input = bf.readLine().split(" ");
            pointList.add(new Point(Integer.parseInt(input[0]), Integer.parseInt(input[1])));
        }

        List<Segment> segments = new ArrayList<>();
        segments.add(new Segment(pointList.get(0), pointList.get(1)));
        segments.add(new Segment(pointList.get(1), pointList.get(2)));
        segments.add(new Segment(pointList.get(2), pointList.get(0)));

        Segment segment = Collections.max(segments);

        Point answer1, answer2;
        answer1 = new Point(segment.p2.x, segment.p1.y);
        answer2 = new Point(segment.p1.x, segment.p2.y);

        for (Point p : pointList) {
            if (p.x == answer1.x && p.y == answer1.y) {
                System.out.printf("%d %d\n", answer2.x, answer2.y);
                break;
            } else if (p.x == answer2.x && p.y == answer2.y) {
                System.out.printf("%d %d\n", answer1.x, answer1.y);
                break;
            }
        }

    }

    static class Point {
        int x, y;
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    static class Segment implements Comparable<Segment> {
        Point p1, p2;
        double length;
        double angle;

        Segment(Point p1, Point p2) {
            this.p1 = p1;
            this.p2 = p2;
            this.length = Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
            this.angle = Math.toDegrees(Math.atan2(p1.y - p2.y, p1.x - p2.x));
        }

        @Override
        public int compareTo(Segment o) {
            return (this.length > o.length)? 1 : -1;
        }
    }
}

해결


참고

링크

 

 

 

728x90
반응형
728x90
반응형

주어

주어 자리에는 명사/대명사/to부정사/동명사/명사절 등등이 올 수 있다.

 

명사 주어

Applications shuld be received no later than this Monday.

지원서는 늦어도 이번 일요일 까지는 접수되어야 한다.

대명사 주어

You are not supposed to use a cell phone during the meeting.

당신은 미팅 중에는 휴대폰을 사용할 수 없다.

명사구 주어

A protective helmet should be worn at all times. (형용사 + 명사)

보호 헬멧은 항상 착용해야 한다.

People in the lobby are visiting from Celta Consulting Group. (명사 + 전치사구)

로비에 있는 사람들은 Celta 컨설팅 그룹에서 온 사람들이다.

* 명사구는 2개 이상의 명사나 수식어구가 붙은 명사를 일컫는 말이다.

 

to부정사 주어 (to+동사원형)

To promote a new line of shoes is our main goal.

새로 나온 신발을 홍보하는 것이 우리의 주된 목표이다.

동명사 주어 (동사원형+ing)

Dealing with customer complaints is my main duty.

고객들의 불만을 처리하는 것이 나의 주된 임무이다.

* to부정사와 동명사는 '~하는 것은' 이라고 해석된다.
* to부정사, 동명사가 나올 때 동사는 단수 is(o), are(x)

 

what을 사용한 명사절 주어

What you said cannot be true.

네가 말한 것은 사실일 리가 없다.

What we discussed at the sales meeting will be passed onto the board of directors.

(= what+주어+동사) 우리가 영업 회의에서 논의한 것은 이사회에 전달 될 것이다.

that을 사용한 명사절의 주어

That you read the instructions carefully is necessary.

= It is necessary that you read the instructions carefully.

당신이 지시사항을 꼼꼼히 읽어보는 것이 필요하다.

* that절이 이끄는 명사절 주어의 경우는 문장 뒤로 보내고 그 자리에 가주어 it을 쓴다

 

주어와 동사의 일치 - 수 일치

동사의 형태는 주어의 수, 태, 문장의 시제에 맞춰 써야 한다.

 

단수 주어 + 단수 동사

Mr. Yamamoto's proposal is going to be discussed at tomorrow's meeting.

Yamamoto 씨의 제안서는 내일 회의에서 논의될 것이다.

복수 주어 + 복수 동사

Technicians are scheduled to take a look at the computers.

기술자들이 컴퓨터를 살펴볼 예정이다.

 

동명사/to부정사/가주어 it + 단수동사

Having a good understanding of marketing strategies is crucial to become a marketing director.

(동명사 주어 + 단수동사) 마케팅 전략에 대해 정통하고 있는 것이 마케팅 이사가 되는 데에 매우 중요하다.

 

It is difficult to adjust to a completely different environment. (가주어 it + 단수 동사)

완전히 다른 환경에 적응하는 것은 어렵다

* To adjust to a completely different evironment = 진짜 주어

 

주어와 동사의 일치 - 태 일치

주어 + 능동의 동사 (주어가 ~을 한다)

The company decided to transfer Mr. Day to another part of the country.

회사는 Day 씨를 다른 지역으로 전근시키기로 결정하였다.

주어 + 수동의 동사 (주어가 ~가 된다, ~을 받다)

Your monthly rent must be paid by the end of the month.

월세는 월말까지 지불되어야 한다. (월세가 지불되다 == 수동의 의미)

 

주어와 동사의 일치 - 시제 일치

과거 시제

They informed us of the schedule change a few days ago.

그들은 며칠 전에 일정 변경에 대해 알려주었다.

미래 시제

Next year, the company is  going to set up a new branch in the country.

내년에 회사는 그 나라에 새로운 지점을 설립할 것이다.

 

연습 문제

1. The _____ of a new highway will definitely attract more tourists from othe parts of the country.

(a) construct 

(b) constructing

(c) constructive

(d) construction

 

정답 (d)

 

그런데 The constructing of a new 도 사실은 가능한 문법이다.

그런데도 왜 d가 정답인지 챗gpt에게 물어봤다

네, "The constructing of a new highway will definitely attract more tourists from other parts of the country."라는 문장도 문법적으로 가능한 문장입니다. 하지만 보통은 "the construction of a new highway"이라는 표현이 자연스럽게 쓰이는 경우가 많습니다.

 

정답이 b가 되지 못하는이유를 ChatGPT에게 물어봤다

네, "The constructing of a new highway will definitely attract more tourists from other parts of the country."라는 문장도 문법적으로 가능한 문장입니다. 하지만 보통은 "the construction of a new highway"이라는 표현이 자연스럽게 쓰이는 경우가 많습니다.

 

잘 이해가 안되어서 한국어와 비슷한 예시가 있는지 물어봤다

예를 들어, "책 읽기"와 같은 표현은 동작을 나타내는 동사 "읽다"의 명사형태인 "읽기"를 사용하여 만들어졌습니다. 이때 "책"이라는 명사를 꾸며주는 관계에서는 "책을 읽기"와 같은 표현이 자연스럽지 않은 반면, "책 읽기"와 같은 표현이 보다 자연스러운 표현입니다.
또한, "산책하기"와 같은 표현에서도 "산책"이라는 명사를 꾸며주는 관계에서 "산책을 하기"보다는 "산책하기"와 같은 동명사 형태가 보다 자연스러운 표현입니다.

그러니까 이미 명사로 쓸 수 있을 때는 명사로 사용하는 것이 더 자연스럽다는 것이다...

 

 

2. The ____ of the new president will be finalized next Monday.

(a) appoint

(b) appoints

(c) appointment

(d) appointing

 

정답 (c)

 

이것도 위와 같은 실수를 했다

appoint는 동사, appointment는 명사

네, "The appointing of the new president will be finalized next Monday."는 문법적으로는 올바른 문장입니다. 그러나 보통은 "The appointment of the new president will be finalized next Monday."와 같이 "appointment"이라는 명사형태를 사용하는 것이 자연스러운 표현입니다.
"appointing"은 "appoint"라는 동사의 동명사형태이며, "appointment"은 "임명" 또는 "지정"을 나타내는 명사입니다. 따라서, 전체적인 의미는 "새로운 회장의 임명은 다음 주 월요일에 최종적으로 결정될 것이다"입니다.

보통 -ment, -tion은 명사라고 한다

 

728x90
반응형
728x90
반응형

파이썬의 연산자

연산자
+ 더하기
- 빼기
* 곱하기
/ 나누기(소수점)
** 제곱
//
% 나머지
() 괄호 안을 먼저 연산

 

파이썬의 변수

변수 이름 뒤 등호(=)로 값을 저장한다

C언어나 JAVA 처럼 자료형을 지정해주지 않는다

 

변수 이름은 대/소문자, 숫자, 밑줄로 사용

대소문자는 구분됨

파이썬의 변수 네이밍룰은 소문자로 _ 를 사용하여 구분하여 사용한다고 한다

 

출력

print(변수), print("hello")

def print_hi(name):
    print("I like", end='')
    print(" money")


if __name__ == '__main__':
    print_hi('PyCharm')

 

판단

파이썬의 참 값은 True, 거짓 없은 False

==, !=, <, >, <=, >= 와 같은 비교 연산자가 있다

 

if elif else

 

반복

for x in range(5) : print(x)

 

for x in range(1, 11): print(x)

 

i = 0

while i <= 10:

 print(i)

i += 1

 

함수

def 함수():

 

 

 

 

728x90
반응형
728x90
반응형

문제

체스판은 8×8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램을 작성하시오.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i<8; i++) {
            sb.append(reader.readLine());
        }
        String[] arr = sb.toString().split("");
        int count = 0, line = 0, tmp = 0;
        for (int i = 0; i<arr.length; i++) {
            tmp++;
            if (tmp == 9) {
                line++;
                tmp = 1;
            }
            if (line % 2 == 0 && i % 2 == 0 && arr[i].equals("F")) {
                count++;
            } else if (line % 2 == 1 && i % 2 == 1 && arr[i].equals("F")) {
                count++;
            }
        }
        System.out.println(count);
    }
}

해결

생각


참고

링크

 

 

 

728x90
반응형
728x90
반응형

자료구조

데이터를 저장, 조직, 관리하는 방법

책들이 난잡하게 어질러져있음 -> 책을 카테고리에 맞게 분류

 

자료구조의 일상 생활과 프로그래밍 문제 해결과의 차이

건축물을 만들려면 : 건축 재료(철근, 시멘트, 벽돌)의 이해가 필요. 샤시, 철골, 인터넷 연결 구조

프로그래밍 : 데이터 구조와 모듈의 이해가 필요. 리스트, 스택, 트리 구조

즉 상황에 맞게 어떤 자료구조를 사용할지 판단해야함

 

자료구조의 종류

배열, 리스트, 스택, 큐, 그래프, 트리, 최대 힙, 행렬....

선형 자료구조 :리스트, 스택, 큐

색인 자료구조 :검색트리(이진 검색트리, 균형 검색 트리), 해시 테이블

효율적인 자료구조 :우선순위 큐: 힙

관계 처리 자료구조 :그래프

 

알고리즘

문제 해결 과정을 묘사하는 것

문제 해결 절차를 체계적으로 기술한 것

 

문제의 요구 조건: 입력과 출력으로 명시할 수 있다.

알고리즘은 입력에 대한 출력을 만드는 과정을 기술

 

프로그램 = 자료구조 + 알고리즘 + α

 

알고리즘의 기술 방법

1. 자연어를 이용한 서술적 표현

  • 단어, 언어, 표현에 의존적
  • 모호함
  • 이해하기 쉬움

2. 흐름도를 이용한 도식화

  • 직관적이고 이해하기 쉬움
  • 알고리즘이 복잡할 수록 흐름도 또한 복잡해짐

3. 의사코드를 이용한 추상화 (가상 코드)

  • 알고리즘 기술에 가장 많이 사용
  • 핵심적인 알고리즘의 내용에 집중 가능
  • 프로그래밍 언어에 대한 의존성이 없음

4. 프로그래밍 언어

  • 알고리즘의 가장 정확한 기술이 가능
  • 내용에 대한 이해를 방해할 수 있음
  • 프로그래밍 언어에 대한 의존성 존재

 

추상 자료형 (ADT:Abstract Data Type)

추상 : 세세한 부분을 표현하지 않고 전체적인 이미지를 표현한 것

데이터 타입이 추상적 -> 데이터나 연산이 무엇인지 정의됨 그러나 어떻게 구현할 것인지는 정의되지 않음

추상화 : 중요한 정보는 강조되고 중요하지 않은 구현은 제거

 

ADT : 세부적인 부분에서 벗어나 추상적으로 정의한 데이터 타입

즉, 데이터 타입이 어떤 작업으로 이루어지는지 표현

 

알고리즘의 성능 분석

분석 기법

1. 수행 시간 측정

  • 두 개의 알고리즘의 실제 수행 시간을 측정 및 비교
  • 실제로 구현 해야함
  • 동일한 하드웨어, 동일한 사용 환경에 적용

2. 알고리즘의 복잡도 분석

  • 직접 구현하지 않으면서 수행시간을 분석
  • 알고리즘이 수행하는 연산의 횟수를 측정

알고리즘 A는

n * n이라는 곱셈 연산을 한번 한다 (1)

그리고 sum이라는 변수이 곱셈한 결과를 한 번 대입한다 (1)

총 두 번의 연산를 한다

 

알고리즘 B는

sum과 n을 더하는 덧셈 연산을 한 번 한다 (1)

그리고 sum이라는 변수에 덧셈 결과를 한 번 대입한다 (1)

그런데 위 연산은 1부터 n번 반복하는 for문 안에서 동작한다

 

다시 덧셈 연산은 총 n 번 한다 (n)

대입 연산은 총 n 번 한다 (n)

그러니까 총 n * n = n^2의 연산을 한다

 

알고리즘 C는

덧셈과 대입 연산을 각각 한 번 한다

그런데 이연산은 N번 반복하는 FOR문 안에 있다

그런데 이 FOR문은 또 N번 반복하는 FOR문 안에 있다

그러니까 n * n + n * n 총 2n^2번 한다

 

빅오(O) 표기법

자료의 개수가 많은 경우 차수가 가장 큰 항이 가장 영향을 크게 미치고 다른 항들은 상대적으로 무시한다

 

예)

n = 1000 일 때

n^2 -> 99.9%, n+1 -> 0.1% 라는 결과가 나옴 즉, n + 1은 무시해도 됨
 

 

 

쉽게 말하면 빅오표기법의 시간복잡도는 O(최고차항에서 계수 땐 것)

f(n) = 5 일 때 O(1),

f(n) = n^2 일 때 O(n^2),

f(n) = 2n^2 + n + 1 일 때 O(n^2)

 

 

 

728x90
반응형
728x90
반응형
static boolean isLeapYear(int year) {
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}

c/c++ 이면 boolean 대신에 int를 쓰면 됨

728x90
반응형
728x90
반응형

문제

지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다.

막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다.

  1. 지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이때, 합이 X보다 크다면, 아래와 같은 과정을 반복한다.
    1. 가지고 있는 막대 중 길이가 가장 짧은 것을 절반으로 자른다.
    2. 만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다.
  2. 이제, 남아있는 모든 막대를 풀로 붙여서 Xcm를 만든다.

X가 주어졌을 때, 위의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 구하는 프로그램을 작성하시오. 


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Main {
    private static final int STICK = 64;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        List<Stick> brokenSticks = new ArrayList<>();
        Stick stick = new Stick(STICK);

        while (true) {
            int sum = 0;

            for (Stick s : brokenSticks) {
                sum += s.getLength();
            }
            if (sum == n) {
                break;
            } else if (sum + stick.getLength() <= n) {
                brokenSticks.add(stick);
            }
            stick = stick.broken();


        }
        System.out.println(brokenSticks.size());
    }

    static class Stick {
        Stick s;
        int length;
        public Stick(int length) {
            this.length = length;
        }

        public Stick broken() {
            this.s = new Stick(length/2);
            return this.s;
        }

        public int getLength() {
            return length;
        }


    }
}

해결


참고

링크

 

 

 

728x90
반응형