백준 STROJOPIS

KIMYEONGJUN·2026년 1월 9일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

The first and only line of input contains of a string consisting of at least one and at most fifty characters.
The string doesn’t contain whitespaces and consists only of characters depicted on the image above.

The output must consist of eight lines, in each line one integer denoting the number of presses of each finger, excluding thumbs, observed from left to right.

내가 이 문제를 보고 생각해본 부분

BufferedReader 및 StringBuilder 준비:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: 콘솔로부터 입력을 효율적으로 읽어들이기 위해 BufferedReader를 사용한다.
StringBuilder sb = new StringBuilder();: 결과를 출력할 때 System.out.println()을 여러 번 호출하는 것보다 효율적으로 문자열을 만들고 한 번에 출력하기 위해 StringBuilder를 사용한다.
fingerMap 초기화 및 손가락 매핑:
Map<Character, Integer> fingerMap = new HashMap<>();: HashMap을 생성하여 각 char 타입의 문자를 int 타입의 손가락 인덱스에 매핑한다. 
이 맵은 문자열의 각 문자가 어떤 손가락으로 타이핑되는지를 결정하는 핵심 자료구조이다.
"1QAZ".chars().forEach(c -> fingerMap.put((char) c, 0));: String.chars() 메서드를 이용해 문자열의 각 문자를 IntStream으로 얻은 후, forEach 람다 표현식을 사용해 해당 문자와 손가락 인덱스(여기서는 0, 즉 왼손 새끼손가락)를 fingerMap에 추가한다.
다른 손가락들도 이와 같은 방식으로 매핑된다.
Shift 키 조합 문자 처리: 문제 이미지에는 Shift 키 조합 문자가 명확히 표시되어 있지는 않지만, 일반적인 US 키보드 레이아웃에서 숫자 위에 있는 특수문자(!, @, #, $, %, ^, &, *, (, ), _, +, {, }, :, ", <, >, ?)도 해당 숫자를 타이핑하는 손가락으로 누르는 것이 일반적이다. 
예시 입력에는 = ; [ ] ' . , 등이 있었기 때문에, 이미지에 나와 있는 키를 최대한 반영한다.
input 문자열 읽기:
String input = br.readLine();: BufferedReader를 통해 입력으로 주어진 한 줄의 문자열을 읽어 input 변수에 저장한다.
fingerCounts 배열 초기화:
int[] fingerCounts = new int[8];: 엄지손가락을 제외한 8개 손가락의 사용 횟수를 저장하기 위한 int 배열을 생성한다. 
배열은 기본적으로 모든 요소가 0으로 초기화된다.
fingerCounts[0] = 왼손 새끼
fingerCounts[1] = 왼손 약지
fingerCounts[2] = 왼손 중지
fingerCounts[3] = 왼손 검지
fingerCounts[4] = 오른손 검지
fingerCounts[5] = 오른손 중지
fingerCounts[6] = 오른손 약지
fingerCounts[7] = 오른손 새끼
문자열 순회 및 카운트:
for(char ch : input.toCharArray()) { ... }: 입력 문자열 input을 char 배열로 변환한 후, 각 문자를 ch 변수에 담아 반복한다.
if(fingerMap.containsKey(ch)): 현재 문자가 fingerMap에 정의되어 있는 키(즉, 손가락으로 누르는 문자)인지 확인한다. 
이 문제에서는 입력 문자열이 항상 정의된 문자만 포함한다고 되어있지만, 일반적인 안정성을 위해 확인한다.
int fingerIndex = fingerMap.get(ch);: fingerMap에서 현재 ch 문자에 해당하는 손가락의 인덱스를 가져온다.
fingerCounts[fingerIndex]++;: 해당 손가락 인덱스에 해당하는 fingerCounts 배열의 값을 1 증가시켜 사용 횟수를 기록한다.
결과 출력:
for(int count : fingerCounts) { sb.append(count).append("\n"); }: 모든 문자에 대한 처리가 끝난 후, fingerCounts 배열에 저장된 각 손가락의 최종 카운트 값을 StringBuilder에 추가한다. 
각 숫자는 새 줄로 구분된다.
System.out.print(sb.toString());: StringBuilder에 누적된 최종 문자열을 한 번에 출력한다.
리소스 해제:
br.close();: BufferedReader를 닫아 시스템 리소스를 해제한다.

코드로 구현

package baekjoon.baekjoon_32;

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

// 백준 10551번 문제
public class Main1262 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // 0: 왼새끼, 1: 왼약지, 2: 왼중지, 3: 왼검지
        // 4: 오른검지, 5: 오른중지, 6: 오른약지, 7: 오른새끼
        Map<Character, Integer> fingerMap = new HashMap<>();

        // 왼손 새끼손가락 (인덱스 0)
        "1QAZ".chars().forEach(c -> fingerMap.put((char) c, 0));
        "!".chars().forEach(c -> fingerMap.put((char) c, 0)); // Shift + 1

        // 왼손 약손가락 (인덱스 1)
        "2WSX".chars().forEach(c -> fingerMap.put((char) c, 1));
        "@".chars().forEach(c -> fingerMap.put((char) c, 1)); // Shift + 2

        // 왼손 중지 (인덱스 2)
        "3EDC".chars().forEach(c -> fingerMap.put((char) c, 2));
        "#".chars().forEach(c -> fingerMap.put((char) c, 2)); // Shift + 3

        // 왼손 검지 (인덱스 3)
        "4RFV5TGB".chars().forEach(c -> fingerMap.put((char) c, 3));
        "$%".chars().forEach(c -> fingerMap.put((char) c, 3)); // Shift + 4, Shift + 5

        // 오른손 검지 (인덱스 4)
        "6YHNU7JM".chars().forEach(c -> fingerMap.put((char) c, 4));
        "^&".chars().forEach(c -> fingerMap.put((char) c, 4)); // Shift + 6, Shift + 7

        // 오른손 중지 (인덱스 5)
        "8IK,".chars().forEach(c -> fingerMap.put((char) c, 5));
        "*".chars().forEach(c -> fingerMap.put((char) c, 5)); // Shift + 8

        // 오른손 약손가락 (인덱스 6)
        "9OL.".chars().forEach(c -> fingerMap.put((char) c, 6));
        "(".chars().forEach(c -> fingerMap.put((char) c, 6)); // Shift + 9

        // 오른손 새끼손가락 (인덱스 7)
        "0P;/-=[]'".chars().forEach(c -> fingerMap.put((char) c, 7));
        ")_+{}:\"<>?".chars().forEach(c -> fingerMap.put((char) c, 7)); // Shift + 0, -, =, [, ], ;, ', \, .

        // 예제 입력에는 특수문자 Shift 조합이 보이지 않지만, 문제 지문에 나와있어 포함했습니다.
        // 문제 이미지에 보이는 = [ ] ; ' . , 가 주요 특수문자로 보입니다.

        String input = br.readLine(); // 입력 문자열 읽기
        int[] fingerCounts = new int[8]; // 8개 손가락의 사용 횟수를 저장할 배열

        // 입력 문자열의 각 문자를 순회하며 해당 손가락의 카운트를 증가시킵니다.
        for (char ch : input.toCharArray()) {
            if (fingerMap.containsKey(ch)) { // 맵에 정의된 문자만 처리
                int fingerIndex = fingerMap.get(ch);
                fingerCounts[fingerIndex]++;
            }
        }

        // 결과 출력
        for (int count : fingerCounts) {
            sb.append(count).append("\n");
        }

        System.out.print(sb.toString()); // 최종 결과 한 번에 출력
        br.close(); // BufferedReader 닫기
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글