문제출처: https://www.acmicpc.net/problem/2660

 

풀이

문제를 읽어보면 친구 관계를 그래프로 표현하여 관계가 어떻게 연결되어있는지를 코딩해야 함을 직감할 수 있습니다.

저는 처음에 문제가 이해가 가지않아서 예제 케이스를 그려보며 규칙을 확인했는데, 결과적으로

모든 노드에서 bfs함수를 돌려서 각 경우의 최대 깊이(depth)를 구한 다음 그 중에서 제일 낮은 깊이를 갖는 경우가 회장 후보가 됨을 알 수 있었습니다.

뎁스는 visited배열을 이용하여 구했고 1,2,3,4,5노드에서 각각 bfs를 돌려보면 뎁스가 각각 3,2,2,3이 나오게 되고, 낮은 점수를 갖는 사람이 회장 후보가 되기 때문에 저 데이터를 이용해 후보점수는 2, 후보인원은 3명임을 알 수 있었습니다.

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int n;
vector<int>map[51];
int score[51];
void bfs(int start);
int main()
{
    int  a, b;
    int cnt = 0;
    cin >> n;
    while(1){
        cin >> a >> b;
        if (a == -1 && b == -1)break;
        map[a].push_back(b);
        map[b].push_back(a);
    }
    for (int i = 1; i <= n; i++)
        bfs(i);
    
    //value 3: 1,5노드
    //value 2: 2,3,4노드
    int val = score[1];
    for (int i = 1; i <= n; i++)
        val = (score[i] > val) ? val : score[i];
 
    for (int i = 1; i <= n; i++)
        if (val == score[i])cnt++;
    cout << val << " " << cnt << endl;
    for (int i = 1; i <= n; i++)
        if (score[i] == val)cout << i << " ";
        
    
}
void bfs(int start)
{
    queue<int>q;
    int visited[51];
    memset(visited, 0sizeof(visited));
    q.push(start);
    visited[start] = 1;
    while (!q.empty())
    {
        int num = q.front();
        q.pop();
        for (int i = 0; i < map[num].size(); i++)
        {
            int y = map[num][i];
            if (!visited[y])
            {
                q.push(y);
                visited[y] = visited[num] + 1;
            }
        }
    }
    //all depth from start Node is filled.
    int num = 0;
    for (int i = 1; i <= n; i++)
        num = (visited[i] > num) ? visited[i] : num;
    score[start] = num - 1;//start node value=1 -> minus 1
}
cs
 
결과

 

 

 


[4장 연습문제]



함수 - Q1

시선에 따라 문제가 헷갈릴 수도 있는데(저처럼..)아래와 같이 번역하여 이해하는 게 좋은 것 같습니다.


입력 정수 n이하의 피보나치 수열을 구하라 -> 입력 정수n항 이하의 피보나치 수열을 구하라(n=0,1,2 ....)


재귀함수를 쓰려면 초기 종료 조건이 필요한데, 피보나치 수의 정의에 따르면 전 항+ 전전항 숫자의 합이므로 첫번째, 두번째 항은 무조건 0,1로 주어져야 하기 때문에 이를 이용해 종료조건 코드를 작성할 수 있습니다. 전체 코드는 간결합니다.


* 3번 째 항의 피보나치 수: 2

               



파일 읽고 쓰기 - Q1

sample데이터를 텍스트 파일에 미리 만들어 놓고 주어진 힌트 소스코드를 완성하여 프로그램을 작성하는 방식과

sample.txt의 데이터를 input함수로 입력하고 write한 뒤 읽어들이는 식으로 프로그램을 작성할 수 있습니다. 


이 문제를 풀기 위해서는 다음 2가지를 이해하고 있어야 합니다.

1. 파일 입출력의 write함수는 데이터를 무조건 문자열(str) 자료형만 사용할 수 있다.

2. 파일 입출력의 read함수로 데이터를 읽어들이기 위해 int로 형변환하여 파일속 숫자를 읽어들여야한다.

(텍스트 파일에 숫자가 저장되어 있지만 실제로는 int형이 아닌 문자열 자료형으로 입력되었기 때문입니다.)


1. 정답 코드(sample.txt에 데이터를 미리 넣어둔 뒤 read->write하는 방식)

13행에서 문자열로 형변환하여 데이터를 write해야합니다.



만약 13행을 아래 처럼 작성하면 write함수는 문자열만 가능하다고 오류가 뜹니다.

             



2. 응용 코드(샘플 데이터를 write하여 넣어둔 뒤 read->write하는 방식)

4행에서 '\n'을 넣어주지 않으면 sample.txt에 데이터가 한 줄로 저장이 되어버립니다.


                   








'점프 투 파이썬' 카테고리의 다른 글

3장 연습문제  (0) 2021.01.07
2장 연습문제  (0) 2021.01.06


[3장 연습문제]


Q1- if문과 Q1-while문 연습문제는 헷갈릴만한 부분들을 응용하여 추가 작성하였습니다.



if문 - Q1

코드를 해석하면 "shirt"가 출력됩니다. 헷갈릴 수 있는 부분은 if~if~else문 구조가 아닌 if~elif~else 구조이기 

때문에 "need"는 출력되지 않는 점입니다.  


1) 정답 코드

                 


2) "need"까지 출력하기 위한 코드

               


while문 - Q1

i와 if문이 힌트로 주어졌기 때문에 i<=5까지 각 라인에 별을 찍고 i>5가 되었을 때 반복문을 탈출합니다.

별찍기의 경우 예전에 많이 풀어봤던 유형이라 가볍게 역방향 별찍기 코드도 구현해 보았습니다.


1) 정답 코드

                 


2) 역방향 별찍기

              


for문 - Q1

힌트 코드를 이용하여 쉽게 구현할 수 있습니다.

             


'점프 투 파이썬' 카테고리의 다른 글

4장 연습문제  (0) 2021.01.12
2장 연습문제  (0) 2021.01.06


[2장 연습문제]


문자열 - Q1

슬라이싱 이용


             



문자열 - Q2

인덱싱 이용


           


리스트 - Q1

reverse함수는 리스트를 자동으로 전체 정렬해주지 않기 때문에 [5,4,3,2,1]로 만들기 위해 sort-> reverse과정을 거칩니다.


                 


리스트 - Q2

낯선 문법이었는데, 사용자가 정의한 문구(" ")를 이용해 리스트를 문자열로 만들 수 있습니다.


           


튜플 - Q1

튜플은 +기호를 이용해 원소를 추가할 수 있는데, 하나의 원소를 갖는 튜플은 괄호 안 원소 뒤에 쉼표(,)를 추가해야 하므로  

아래와 같이 표현할 수 있습니다.


                     


딕셔너리 - Q1


          


집합 - Q1

집합 자료형은 원소가 중복될 수 없고 정답이 리스트 꼴로 되어있기 때문에 리스트->집합->리스트꼴로 변환하여 출력합니다.


             


변수 - Q1

다음 코드의 결과 및 이유 


                 


a와 b 모두 같은 [1,2,3] 리스트 객체를 가리키고 있기 때문에 a의 원소값이 변하면 b의 원소값도 같이 변합니다.


참고) a[1]을 변동시키되 b값은 처음 [1,2,3]을 유지하기 위해 다음 2가지 방법으로 구현할 수 있습니다.


1.  [:] 이용

a의 값을 모두 복사하여 b에 저장하기 때문에 a와 b가 가리키는 리스트는 각각 다르기 때문입니다.

                


2. copy모듈

b= copy(a)는 b=a[:]와 동일하기 때문에 1번방법과 결과가 동일합니다.


           



'점프 투 파이썬' 카테고리의 다른 글

4장 연습문제  (0) 2021.01.12
3장 연습문제  (0) 2021.01.07


[10장 연습문제]


1. 분산 환경에서 시스템을 구성하는 하드웨어와 소프트웨어 요소들이 물리적으로 어떻게 배치되는지를 보여주는 UML다이어그램은? 4 (배치 다이어그램)


2. 동적 모델링에 사용하는 UML 다이어그램이라 할 수 없는 것은? 1 (배치 다이어그램)


3. 배치 다이어그램을 사용해 시각화 하거나 문서화 하는데 효과적이지 않은 시스템은? 2(사용자 관점 시스템)

-> 서비스, 기능 등을 사용자 관점에서 보여주는 시스템은 유스케이스 다이어그램입니다.


4. 배치 다이어그램의 요소에 대한 설명으로 적절하지 않은 것은? 4 (확장, 포함 관계는 조건/필수의 경우의 관계를 갖는다.)

-> 확장관계, 포함 관계를 실행해야 하는 경우의 다이어그램은 유스케이스 다이어그램입니다.


7. 다음 버스 안내 시스템의 명세서를 보고 배치 다이어그램을 작성하시오.

--------------------------------------------------

휴대폰/인터넷으로 목적지 입력

버스 노선 안내 시스템에서 입력데이터 처리 후 사용자에게 전달

각 정류장의 LED모니터를 통해 시스템에서 전달하는 버스의 위치/예상 도착 시간 파악

--------------------------------------------------


1) 노드식별: 휴대폰, 인터넷, 노선 안내 시스템, LED모니터

2) 컴포넌트 식별: 입력 인터페이스 모듈, 데이터 처리/전송 모듈

3) 노드 간 구성 관계: 휴대폰/인터넷 - 노선 안내시스템 - LED모니터

4) 컴포넌트 배치: 휴대폰/인터넷(입력 인터페이스 모듈), 노선 안내시스템(데이터 처리/전송 모듈)

5) 최종 다이어그램




[8장 연습문제]


1. 소프트웨어 재사용과 관련하여 객체들의 모임, 대규모 대사용 단위로 정의되는 것은? 2(Component)

-> 별다른 설명이 필요 없습니다.


2. 컴포넌트 다이어그램에 대한 설명으로 옳지 않은 것은? 4(실제 소프트웨어의 설계 혹은 구현을 위한 용도로 사용된다.)

-> 컴포넌트 다이어그램은 소프트웨어를 물리적으로 어떻게 구현할지를 정의하는 다이어그램입니다. 

    해당 보기는 클래스 다이어그램에 대한 설명입니다.


3. 컴포넌트에 대한 설명으로 옳지 않은 것은? 2 (클래스와 유사한 개념으로 소스레벨에서의 재사용을 위한 것이다.)

-> 컴포넌트는 바이너리 레벨에서 재사용 하기 위해 사용됩니다. (저도 이해가 잘 안갑니다.)


4. 생략, 답은 4번 ( 요구 인터페이스가 아니라 제공 인터페이스입니다.)


5. 컴포넌트 다이어그램의 모델 요소에 대한 설명으로 옳지 않은 것은? 2 ( 컴포넌트 액터는 시스템과 상호작용하는 사람이나 사물을 의미한다.)

-> 해당 설명은 유스케이스 다이어그램의 모델 요소에 관한 설명입니다.


6. 다음 주문 관리 시스템의 명세서를 보고 컴포넌트 다이어그램을 작성하시오.

- 고객이 주문 시스템에서 상품을 검색하면 재고 시스템에서 해당 상품을 검색한 결과를 고객에게 보여준다.

- 고객은 검색된 상품의 결과를 장바구니에 저장한 후 구매한다.





[8장 연습문제]


1. 상태 다이어그램에 관한 설명으로 가장 적당한 것은? 4 (단일 유스케이스에 대한 시스템 동작을 나타낸다.)

-> 특정 객체 관점 or 시스템 전체의 자세한 동작을 기술하는데 사용하는 다이어그램이다.


2. 상태 다이어그램에서 상태 전이 선에 추가되는 정보로 올바른 것은? 1 (이벤트와 동작)

-> "이벤트/동작" 으로 표현한다. ( ' / ' 으로 구분)


3. 상태 다이어그램의 신호에 대한 설명으로 옳지 않은 것은? 2 (상태 전이를 일으키는 이벤트를 의미한다.)

-> 메시지에 관한 정의이다. 


4. 상태 다이어그램에 대한 설명으로 옳지 않은 것은? 1 (다이어그램을 작성하여 유스케이스 시나리오를 모델링할 수 있다.)

-> 상태 다이어그램의 작성 목적은 아래와 같음. 즉, 유스케이스 시나리오는 이미 작성되어있고 검증하는 목적이 강함.

 1) 클래스 다이어그램에서 정의된 속성과 오퍼레이션의 적합성을 검증

 2) 객체의 동적 상태변화를 정의하고 분석

 3) 객체 상태 변화를 유발하는 이벤트를 식별하고 상세히 정의


5. 상태 다이어그램에서 전이를 위한 이벤트 유형에 대한 설명으로 적절하지 않은 것은? 3 (변경: 조건에 관계없는 전이 발생)

-> 변경은 조건이 참일 때만 전이를 발생시키는 종류다.


6. 상태 다이어그램을 사용하는 경우로 적절하지 않은 것은? 4 (순차로직, 업무 절차, 워크 플로를 기술할 때 사용된다.)

-> 활동 다이어그램을 의미한다.


7. 생략, 답은 4번


8. 생략, 답은 3번


9. 다음 비디오숍 관리 시스템의 요구 명세서를 보고 상태 다이어그램을 작성하시오.

----------------------------------------------

- 회원가입을 한 회원만 비디오 대여

- 회원은 가입 시 입력한 이름, 전화 번호 통해 확인

- 비디오 숍 시스템은 대여, 반납, 연체 확인 기능 존재

- 대여 시 비디오 선택 시 코드 확인하여 시스템에 입력, 연체 중인 고객은 대여 불가( 연체료 납부 후 가능)

- 대여 시 대여 목록에 비디오 코드, 고객명 등록

- 관리자는 연체 관리 기능을 통해 연체 회원과 비디오를 확인

- 반납 시 반납한 비디오 코드를 입력하여 대여 목록에서 삭제

----------------------------------------------





[7장 연습문제]


1. 활동 다이어그램에 관한 설명으로 잘못된 것은? 1 (시스템의 정적 구조를 표현한다.)

-> 활동 다이어그램은 동적 다이어그램이다.


2. 활동 다이어그램에 관한 설명으로 잘못된 것은? 4 (요소들을 그룹으로 조직하기 위한 메커니즘이다.)

-> 각 요소들을 이용할 뿐(활동 및 전이, 동기화 막대 등) 그룹으로 조직하여 표현하진 않는다.


3. 아래 설명에 해당하는 다이어그램은? 2 (활동 다이어그램)

- 유스케이스에서 흐름을 모델링 하는데 사용

- 객체의 연산에 대한 flow chart로 활용

- 비즈니스 프로세스 모델링


7. 다음 식당 관리 시스템의 명세서를 보고 활동 다이어그램을 작성하시오.

-----------------------------------------------------

- 식당을 찾은 고객은 테이블 착석-> 음식주문(메인요리 주문 or 요리 추천받음)

- 에피타이저-> 메인요리-> 디저트 순으로 식사

- 결제 및 팁 제공

- 입장 고객은 코트나 모자를 입었을 때 지배인을 통해 보관할 수 있음

------------------------------------------------------


<활동 다이어그램>


+ Recent posts