Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[241122] BOJ 1283 단축키 지정 #1017

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

Conversation

sjhlko
Copy link
Collaborator

@sjhlko sjhlko commented Nov 22, 2024

이슈넘버

#1014

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

public class ShortCut {
    //https://www.acmicpc.net/problem/1283
    //단축키 지정
    static Set<Character> keys = new HashSet<>();

    static char changeCase(char c) {
        if (c >= 'a' && c <= 'z') return (char) (c - 32);
        return (char) (c + 32);
    }

    static String solution(String[] options) {
        boolean flag = false;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < options.length; i++) {
            String option = options[i];
            if (!flag && !keys.contains(option.charAt(0))) {
                keys.add(option.charAt(0));
                keys.add(changeCase(option.charAt(0)));
                sb.append('[')
                  .append(option.charAt(0))
                  .append(']');
                sb.append(option.substring(1));
                sb.append(" ");
                flag = true;
                continue;
            }
            sb.append(option)
              .append(" ");
        }
        if(flag) return sb.toString();


        sb = new StringBuilder();
        flag = false;
        for (int i = 0; i < options.length; i++) {
            for (int j = 0; j < options[i].length(); j++) {
                if (!flag && !keys.contains(options[i].charAt(j))) {
                    keys.add(options[i].charAt(j));
                    keys.add(changeCase(options[i].charAt(j)));
                    sb.append('[')
                      .append(options[i].charAt(j))
                      .append(']');
                    flag = true;
                    continue;
                }
                sb.append(options[i].charAt(j));
            }
            sb.append(" ");
        }
        return sb.toString();
    }

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(bf.readLine());
        StringBuilder sb = new StringBuilder();
        while (N-- > 0) {
            String[] options = bf.readLine()
                                 .split(" ");
            sb.append(solution(options))
              .append("\n");
        }
        System.out.println(sb);
    }
}

소요시간

30분

알고리즘

구현

풀이

  • 단축키를 대/소문자 모두 저장할 셋을 선언하여 관리한다.
  • 매 문자열마다 공백을 기준으로 split 하고 해당 문자열 배열을 매개변수로 넘겨서 다음과정을 거친다.
  • 단어의 첫 글자가 단축키로 지정돼있는지 확인하고 돼있지 않다면 해당 키를 셋에 추가한 뒤 해당 글자앞뒤로 []를 추가하고 나머지 단어들까지 이어붙여 리턴한다.
  • 만약 단어의 모든 앞글자가 단축키로 지정돼있다면 문자열의 모든 문자를 탐색하며 단축키로 지정할 수 있는 키를 찾고 위와 같은 과정을 반복한다.
  • 해당 과정 수행 중 단축키로 지정할 수 없다면 순수한 그 문자열을 리턴한다.

@sjhlko sjhlko added this to the 44주차 milestone Nov 22, 2024
@sjhlko sjhlko self-assigned this Nov 22, 2024
@u1qns u1qns self-requested a review November 26, 2024 11:21
Copy link
Member

@u1qns u1qns left a comment

Choose a reason for hiding this comment

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

함수를 호출해서 main문이 깔끔해서 저는 좋았습니다.
그리고 for문을 돌릴 때에도 현재 보고 있는 단어의 길이만큼 반복해주어서 단축키가 맨 마지막 글자였을 때 인덱스가 초과하지 않도록 처리한 것도 좋았습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: No status
Development

Successfully merging this pull request may close these issues.

2 participants