이 영역을 누르면 첫 페이지로 이동
Arc 블로그의 첫 페이지로 이동

Arc

페이지 맨 위로 올라가기

Arc

[Baekjoon] 16934: 게임 닉네임

  • 2023.03.02 10:10
  • Algorithm/PS
글 작성자: SeoArc

문제

닉네임의 접두사를 계속 체크하여 중복없이 별칭을 만들도록 하는 문제이다.

 

풀이

내 풀이

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

public class Main16934 {

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

        StringBuilder sb = new StringBuilder();
        Map<String, Integer> nicknameCount = new HashMap<>(); // 닉네임 접두사 기록
        Map<String, Integer> joinCount = new HashMap<>(); // 닉네임이 나온 횟수 기록
        List<String> aliases = new ArrayList<>(); // 추출된 닉네임 리스트 저장

        int n = Integer.parseInt(br.readLine());
        for (int i = 0; i < n; i++) {
            String str = br.readLine();
            int strLength = str.length();

            boolean isFirst = false; // 처음 넣은 것인지 ex) baekjoon -> b, ba, bae 에서 b를 처음 넣으면 b에서 true체크
            boolean put = false; // 넣은적이 있는지
            joinCount.put(str, joinCount.getOrDefault(str, 0) + 1); // 닉네임 횟수 저장
            for (int j = 1; j <= strLength; j++) {
                String sub = str.substring(0, j);
                // 접두사가 map에 없으면 기록하고, 그 접두사 기록이 첫번째라면 닉네임으로 저장
                if (nicknameCount.get(sub) == null) {
                    nicknameCount.put(sub, 1);
                    if (!isFirst) {
                        aliases.add(sub);
                        isFirst = true;
                    }
                    put = true;
                }
            }

            // 넣은 적이 없다면 닉네임 나온 횟수에서 값을 가져와 닉네임에 적용 후 카운트 증가
            if (!put) {
                int count = joinCount.get(str);
                String nextAlias;
                if (count == 1) {
                    nextAlias = str;
                } else {
                    nextAlias = str + count;
                }
                nicknameCount.put(nextAlias, 1);
                aliases.add(nextAlias);
            }
        }

        for (String alias : aliases) {
            sb.append(alias).append("\n");
        }
        System.out.print(sb);
    }
}

이전에 이와 비슷한 문제를 프로그래머스에서 풀이한 적이 있어서 그때와 같이 map을 통해 풀이하였다.

계속 접두사를 map에 저장하여 체크하였다.

접두사 자리가 비어있는 곳이 있으면 접두사 삽입, 그게 아니라면 등장한 닉네임의 횟수를 붙여 풀이하였다.

 

회고

map으로 체크하여 짧은 시간에 풀이할 수 있었지만, Trie 자료구조를 사용했다면 더 좋은 풀이가 됐을 것 같다.

다음엔 Trie로 풀이해봐야겠다.

'Algorithm > PS' 카테고리의 다른 글

[Baekjoon] 2170: 선 긋기  (0) 2023.03.02
[Baekjoon] 9935: 문자열 폭발  (2) 2023.03.02
[Baekjoon] 1138: 한 줄로 서기  (0) 2023.02.26
[Baekjoon] 17298: 오큰수  (0) 2022.12.06
[Baekjoon] 3190: 뱀  (0) 2022.10.23

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Baekjoon] 2170: 선 긋기

    [Baekjoon] 2170: 선 긋기

    2023.03.02
  • [Baekjoon] 9935: 문자열 폭발

    [Baekjoon] 9935: 문자열 폭발

    2023.03.02
  • [Baekjoon] 1138: 한 줄로 서기

    [Baekjoon] 1138: 한 줄로 서기

    2023.02.26
  • [Baekjoon] 17298: 오큰수

    [Baekjoon] 17298: 오큰수

    2022.12.06
다른 글 더 둘러보기

정보

Arc 블로그의 첫 페이지로 이동

Arc

  • Arc의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (106)
    • Language (28)
      • C++ (0)
      • C# (0)
      • Java (28)
    • Algorithm (47)
      • Algorithm (15)
      • Data Structure (6)
      • PS (26)
    • Computer Science (22)
      • Design Pattern (1)
      • Network (14)
      • OS (7)
    • Game (0)
      • Unity (0)
    • Backend (3)
      • Spring (1)
      • JPA (2)
    • DB (0)
      • SQL (0)
    • DevOps (2)
      • AWS (0)
      • Docker (2)
      • Jenkins (0)
      • Nginx (0)
    • Software Engineering (4)
      • OOP (4)
    • AI (0)
      • Machine Learning (0)
    • Others (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 네트워크
  • graph
  • java
  • 자바
  • 그래프
  • 알고리즘
  • network
  • algorithm

나의 외부 링크

정보

SeoArc의 Arc

Arc

SeoArc

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © SeoArc. Designed by Fraccino.

티스토리툴바