코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

1213번 : 팰린드롬 만들기

2022. 7. 15. 11:18

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

 

1213번: 팰린드롬 만들기

첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 "I'm Sorry Hansoo"를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.

www.acmicpc.net

 

 

문제

 

 

코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String input = br.readLine();
        int alpha[] = new int [26];

        for(int i=0;i<input.length();i++) {
            alpha[input.charAt(i)-65]+=1;
        }

        int isOne=0;
        for(int i=0;i<26;i++) {
            if(alpha[i]%2!=0) isOne++;
        }

        if(isOne>1) {
            System.out.println("I'm Sorry Hansoo");
        }
        else {
            String finish="";
            StringBuilder sb = new StringBuilder();
            for(int i=0;i<26;i++) {
                int x = alpha[i]/2;
                for(int j=0;j<x;j++) {
                    sb.append((char)(i+65));
                }
            }
            String front = sb.toString();
            finish+=front
			
            for(int i=0;i<26;i++) {
            	//mid 넣기
                if(alpha[i]%2!=0){
                    finish+=(char)(i+65);
                    break;
                }
            }
            
            String end = sb.reverse().toString();
            finish+=end
            bw.write(finish); bw.flush();
        }
    }
}

 

 

해결방법

어떻게 풀지 계속 고민하다가 생각해 낸 방법은

  1. 입력받은 문자열의 알파벳 수만큼 각각 배열에 저장
  2. 짝수개인 알파벳으로 펠린드롬 만들기
    1. (알파벳 개수)/2개 만큼 문자열에 담기

이렇게밖에 생각을 하지 못했고 홀수를 어떻게 처리해야 할지 감이 안 와서 약간의 구글링을 하였다.

구글링을 한 결과는 개수가 홀수개인 알파벳은 1개 이하이어야만 펠린드롬을 만들 수 있다는 것을 알았다. 그러므로 펠린드롬을 만들 수 없는 경우를 찾을 수 있었다. 

그리고 홀수개는 정확히 반으로 나눌 수 없으므로 "(알파벳 개수)/2 만큼 문자열에 담기"는 짝수개일 때만 해야 한다고 생각했는데 홀수개도 /2 해서 넣어도 된다. 왜냐하면 어차피 홀수개인 알파벳은 1개이기에 (알파벳 개수)/2 했을 때 남는 1개는 가운데에다 넣으면 되기 때문이다.

 

다시 정리를 해보면

  1. 입력받은 문자열의 알파벳 수만큼 각각 배열에 저장
  2. 홀수개를 가지는 알파벳의 수 세기
    1. 1개 이상이면 "I'm Sorry Hansoo" 출력 후 종료
  3. 펠린드롬 만들기
    1. 모든 알파벳에 대하여 (알파벳 개수)/2개만큼 문자열에 담기 (front)
    2. 홀수개인 알파벳 1개 문자열에 담기 (mid)
    3. front를 reverse 하여 문자열에 담기 (end)
    4. front, mid, end를 이어 붙여 출력 후 종료

며칠 뒤에 다시 한번 풀어봐야겠다.

 

'알고리즘 > 백준' 카테고리의 다른 글

14659번 : 한조서열정리하고옴ㅋㅋ  (0) 2022.07.18
1966번 : 프린터 큐  (0) 2022.07.16
10814번 : 나이순 정렬  (0) 2022.07.14
11659번 : 구간 합 구하기 4  (0) 2022.07.11
16435번 : 스네이크버드  (0) 2022.07.06
    '알고리즘/백준' 카테고리의 다른 글
    • 14659번 : 한조서열정리하고옴ㅋㅋ
    • 1966번 : 프린터 큐
    • 10814번 : 나이순 정렬
    • 11659번 : 구간 합 구하기 4
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바