코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (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 정상우.
코딍코딍

코딩기록

1339번 : 단어 수학
알고리즘/백준

1339번 : 단어 수학

2022. 6. 28. 15:46

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

 

1339번: 단어 수학

첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대

www.acmicpc.net

 

 

문제

 

 

코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); sc.nextLine();
        String srr[] = new String[n];
        int pri[] = new int[26];

        for(int i=0;i<n;i++) {
            String str = sc.nextLine();
            srr[i] = str;
            int len = str.length();
            for(int j=0;j<len;j++) {
                int p = (int)(Math.pow(10,(len-j)));
                pri[str.charAt(j)-65]+=p;
            }
        }

        int alpha[] = new int[26];
        int v=9;
        for(int i=0;i<26;i++) {
            int max=0,index=0;
            for(int j=0;j<26;j++) {
                if(max<pri[j]) {
                    max=pri[j];
                    index=j;
                }
            }
            if(max!=0) {
                alpha[index] = v--;
                pri[index] = -1;
            }
        }

        int sum=0;
        for(int i=0;i<n;i++) {
            int len = srr[i].length();
            int t=0;
            for(int j=0;j<len;j++) {
                t+=alpha[srr[i].charAt(j)-65];
                t*=10;
            }
            sum+=t/10;
        }
        System.out.println(sum);
    }
}

 

 

해결방법

일단 문자열을 읽어 알파벳마다 우선순위를 배열 pri에 저장하였다. 우선순위를 정하는 방법은 문자열 길이를 세서 판단하였다. 아래와 같이 3가지 방법을 시도해보았다.

 

1. "ABCDF" => A=5, B=4, ... 이런 방식으로 우선순위를 배열 pri에 저장하였는데 이 방식은 옳지 않다. 이유는 우선순위가 같은 알파벳 A, B가 있을 때 A가 더 많이 있는 경우 A의 우선순위를 좀 더 높여줘야 하는데 높이려고 1을 더한다면 우선순위가 아예 다른 알파벳을 침범하기 때문이다. 추가적으로 아무 값도 더할 수 없는 문제가 생긴다.

AD => pri[]에 저장된 알파벳 A의 값, pri[]에 저장된 알파벳 D의 값

AD => 2,1
BD => 2,(1+1)
CE => 2,1
-알파벳 D와 A, B, C의 우선순위가 같아지는 문제 발생! D와 E만 구별해야 한다.

ADB => 3,2,1 
BEG => (3+?),2,1 
CFH => 3,2,1
-이 경우엔 알파벳 B의 우선순위에 아무 값도 더할 수 없다.

 

2. "ABCDF" => A=50, B=40, ... 이런 방식으로 우선순위를 배열에 저장하였는데 이 방식도 옳지 않다. 이유는 위의 예시와 같다. 뭘 더하든 우선순위가 아예 다른 알파벳을 침범하거나 아무 값도 더할 수 없는 문제가 생긴다.

 

3. "ABCDF" => A=10^5, B=10^4, ... 이런 방식으로 우선순위를 매긴다면 위의 문제가 다 해결이 된다.

AD => pri[]에 저장된 알파벳 A의 값, pri[]에 저장된 알파벳 D의 값

AD => 100,10
BD => 100,(10+10)
CE => 100,10
-알파벳 D와 A, B, C의 우선순위가 같아지는 문제 해결, D와 E도 구분 가능

ADB => 1000,100,10 
BEG => (1000+10),100,10 
CFH => 1000,100,10
-알파벳 B의 우선순위에 값을 더하여 A, B, C 구분 가능

 

3번의 방법으로 우선순위를 매긴 후 우선순위에 따라 숫자 9부터 차례대로 배열 alpha에 할당하고 연산을 진행하여 문제를 해결하였다.

 

3번의 시도만에 성공했는데 처음 풀어본 골드 문제였는데 역시 골드 문제는 어려운 것 같다.

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

1449번 : 수리공 항승  (0) 2022.06.29
1543번 : 문서 검색  (0) 2022.06.29
1049번 : 기타줄  (0) 2022.06.28
4796번 : 캠핑  (0) 2022.06.26
16953번 : A -> B  (0) 2022.06.26
    '알고리즘/백준' 카테고리의 다른 글
    • 1449번 : 수리공 항승
    • 1543번 : 문서 검색
    • 1049번 : 기타줄
    • 4796번 : 캠핑
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바