[백준 9489] - 사촌(C++)[골드4]

2023. 5. 11. 19:36· CodingTest/Baekjoon
목차
  1. 문제
  2. 🔎문제 설명
  3. 💻전체 코드
  4. 😀느낀 점

문제

https://www.acmicpc.net/problem/9489

 

9489번: 사촌

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 노드의 수 n과 사촌의 수를 구해야 하는 노드의 번호 k가 주어진다. (1 ≤ n ≤ 1,000, 1 ≤ k ≤ 1,000,000) 다음 줄

www.acmicpc.net


🔎문제 설명

K의 사촌을 구하는 문제입니다.

사촌의 정의는 이제 부모가 다르지만, 할아버지, 할머니가 같은 사람들입니다.

 

부모를 저장하기 위해서 parent 배열을 사용했습니다.

parent [idx]는 idx의 부모의 숫자가 저장되어 있습니다.

 

같은 부모인지 아닌지를 판단하기 위해서는 숫자의 차이를 비교하면 알 수 있습니다.

연속된 입력이 아니라면 다른 부모라는 뜻입니다.

1, 3,4,5가 입력이라면 1 / (3,4,5)가 되고, 즉 3,4,5의 부모는 1이 되는 걸 알 수 있습니다.

  1. 첫 번째 입력이라면, 그 숫자를 루트 노드로 지정해 줍니다.
  2. 그리고 이전 입력값과 현재 입력값 비교
    1. 차이가 1이라면, 같은 부모를 가지고 있다는 뜻이기에, parent [idx] = parent_idx로 지정해 줍니다.
    2. 차이가 1이 아니라면, 다른 부모를 가지고 있다는 뜻입니다.
      1. 그렇다면 parent_idx(부모 번호)를 증가시켜 주고, parent [idx]= node [parent_idx]가 됩니다. 

위의 작업을 n번한 뒤, 우리는 k의 사촌을 찾아야 합니다.

k의 사촌은 부모가 다르고, 할아버지가 같아야 하기에, 다음과 같은 식이 도출됩니다.

parent [parent [node [i]]]==parent [parent [k]] //할아버지, 할머니
parent [node [i]]!= parent [k] //부모님
위 2가지 조건을 만족하면 node [i]는 사촌입니다!

💻전체 코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, k;
int main()
{
while (1)
{
cin >> n >> k;
if (n == 0 && k == 0) // 종료해야함.
break;
int parent_idx = -1, before = 0, ans = 0, data;
int parent[1000001];
vector<int> node;
for (int i = 0; i < n; i++){
cin >> data;
node.push_back(data);
if (i == 0){ // 첫입력이면 루트노드임.
before = data;
parent[data] = -1; // 자기가 자신의 부모임.
}
else{
if (before + 1 == data){ // 같은집합.
parent[data] = node[parent_idx];
before = data;
}
else{
before = data;
parent_idx++;
parent[data] = node[parent_idx]; // data의 부모를 넣어줌.
}
}
}
// parent[data]에는 data의 부모가 있습니다.우리는 k의 사촌 수를 찾아야 합니다.
if (k == node[0]){
ans = 0;
}
else{
for (int i = 0; i < node.size(); i++){
// k와 부모가 다르고, k의 부모들과 부모가 같아야합니다.
if (parent[parent[node[i]]] == parent[parent[k]] && parent[node[i]] != parent[k]){
ans++;
}
}
}
cout << ans << endl;
}
}

 

😀느낀 점

  • 구조체로 트리를 선언해서 풀고 싶었지만, 잘 기억이 안 나서 익숙한 배열로 풀었다.
  • 하지만 굳이 트리 형태로 만들어서 풀 필요까지는 없는 것 같다.

 

 

저작자표시 (새창열림)

'CodingTest > Baekjoon' 카테고리의 다른 글

[백준 2533]- 사회망 서비스(C++)[골드3]  (0) 2023.05.15
[백준 1967] - 트리의 지름(C++)[골드4]  (1) 2023.05.12
[백준 21608] - 상어 초등학교(C++)[골드5]  (0) 2023.05.11
[백준 17144] - 미세먼지 안녕!(C++)[골드4]  (0) 2023.05.11
[백준 10942] - 팰린드롬?(C++)[골드4]  (0) 2023.05.04
  1. 문제
  2. 🔎문제 설명
  3. 💻전체 코드
  4. 😀느낀 점
'CodingTest/Baekjoon' 카테고리의 다른 글
  • [백준 2533]- 사회망 서비스(C++)[골드3]
  • [백준 1967] - 트리의 지름(C++)[골드4]
  • [백준 21608] - 상어 초등학교(C++)[골드5]
  • [백준 17144] - 미세먼지 안녕!(C++)[골드4]
재한
재한
안녕하세요 💻
짜이한안녕하세요 💻
재한
짜이한
전체
오늘
어제
  • 분류 전체보기 (504)
    • Skils (118)
      • Android (52)
      • C++ (5)
      • Kotlin (36)
      • Algorithm (24)
      • Server (1)
    • CodingTest (228)
      • Programmers (45)
      • Baekjoon (183)
    • Experience (8)
      • 후기(코딩테스트,프로그램,프로젝트) (8)
    • Computer Science (70)
      • Design Pattern (2)
      • OOP (2)
      • Computer Architecture (14)
      • OS (2)
      • Software Engineering (3)
      • DataBase (8)
      • Network (39)
    • 학교 (75)
      • R프로그래밍 (26)
      • 회계와 사회생활 (17)
      • 컴퓨터학개론 (20)
      • it기술경영개론 (12)

블로그 메뉴

  • 홈
  • 태그
  • 카테고리
  • 글쓰기
  • 설정

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
재한
[백준 9489] - 사촌(C++)[골드4]
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.