Skip to content

Conversation

@hadongun
Copy link
Collaborator

🔗 문제 링크

생태학

✔️ 소요된 시간

1h

✨ 수도 코드

이전 차시에서 했던 집합과 맵을 이용한 문제를 하나 더 가져왔습니다.

image

입력에서 나무의 종이 주어지는데, 이 수를 세어서 각 종이 차지하는 비율을 출력하는 문제입니다.

우선 입력 값의 수가 주어지지 않기 때문에 비어있는 입력이 나올 때까지 반복문으로 입력을 받아주었습니다.

파이썬 집합에서는 빈 값인 경우에 += 1 사용이 안 되더라구요
그래서 if문으로 처음 입력 받는 종이면 =1, 이미 존재한다면 += 1 을 사용하여 입력을 받아주었습니다!>
(입력 받을 때마다 count로 전체 수를 세어주었습니다)

모두 카운트 하였다면 각 종의 value 값에 count를 나누고 100을 곱해 백분율 값을 value값에 덮어씌웠습니다.

출력 조건에 맞게 정렬 후 f-string으로 소수 넷째 자리까지 출력하였습니당.

수도코드

입력 스트림에서 나무 이름들을  줄씩 입력받음
(입력이  줄이면 종료)

딕셔너리 tree를 초기화
전체 나무 수를 세는 변수 count를 0으로 초기화

반복:
    나무 이름을   입력받고 공백 제거
    입력이  문자열이면 반복 종료
    전체 개수 count를 1 증가
    만약 이름이 tree에 이미 있다면:
        tree[name] += 1
    아니면:
        tree[name] = 1처음 등장

모든 나무 이름에 대해:
    등장 횟수를 전체 개수로 나누고 * 100 해서 백분율로 변환
    소수점 4자리까지 반올림하여 덮어씌움

나무 이름들을 알파벳 순으로 정렬해서:
    각각의 이름과 백분율을 출력
    (출력 형식: "이름 비율(소수점 네 자리)")

📚 새롭게 알게된 내용

f-string(gpt)

@froglike6
Copy link
Collaborator

저는 파이썬의 Counter를 사용하여 이 문제를 해결했습니다. Counter는 리스트의 각 요소가 몇 번씩 등장했는지를 반환하는 함수입니다. 이를 활용해 이 문제를 간단히 해결했습니다.

from collections import Counter
trees = list(map(str.rstrip,open(0).readlines()))
total = len(trees)
counter = Counter(trees)
for i in sorted(counter):
    print(f"{i} {(counter[i] / total * 100):.4f}")

Copy link
Contributor

@dohyeondol1 dohyeondol1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 맵을 사용해서 풀었습니다.
맵을 사용하는 한 풀이는 거의 똑같을 것 같네요!

#include <iostream>
#include <map>
#include <string>
#include <iomanip>
#include <sstream>
using namespace std;

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cout << fixed << setprecision(4);
    
    map<string, int> m;
    string tree;
    int total = 0;

    while(getline(cin, tree)) {
        m[tree]++;
        total++;
    }

    for(const auto& [name, cnt] : m)
        cout << name << " " << (double)cnt / total * 100 << '\n';

    return 0;
}

각자 올리는 문제 분류가 달라서 좋네요 ㅎㅎ

@Fnhid
Copy link
Collaborator

Fnhid commented Aug 2, 2025

c++의 map이 확실히 이런 상황에서 유용한 것 같습니다.
cout에 precision이란 기능은 처음 써 보네요!
코드는 현석님과 차이가 없는 관계로 생략하겠습니다.

@Fnhid Fnhid merged commit 83be8d3 into AlgoLeadMe:main Aug 2, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants