요구사항

주어진 주문서는 알파벳 소문자 1글자부터 최대 11글자까지의 모든 문자열이 사전 순으로 정렬되어 있고

일부 삭제된 주문 배열이 주어질 때 삭제된 주문을 제외한 n번째 주문을 구하기

 

 

입력 값

long n 구해야 하는 주문의 순번
String[] bans 삭제된 주문 배열
bans[i] 는 i+1 번째 삭제된 주문을 말한다. (a~z로만 구성)

 

 

풀이

1. 문자를 순번으로 순번을 문자로 변환하는 함수 생성

    -> 문자를 한 글자씩 읽어서 a=1 b=2 .... z=26 으로 변환하는 함수 생성

    -> 숫자를 읽어서 26으로 나눈 나머지문자로 뒷자리부터 변환하는 함수 생성

 

2. 삭제된 주문 배열을 모두 숫자로 변환하기

    -> 구해야 하는 순번과 비교하기 위함

 

3. 구해야 하는 진짜 순번 찾기

    -> 삭제된 주문 배열을 정렬하고 구해야하는 순번의 숫자보다 작은 경우 순번 1씩 증가시킴

 

4. 삭제된 주문을 적용한 새 순번을 다시 문자로 변환하여 return

 

728x90

Java 코드

import java.util.*;

class Solution {
    public String solution(long n, String[] bans) {
        String answer = "";
    
        long num;
        long[] bansNums = new long[bans.length];
        for(int i=0; i<bans.length; i++) {
            bansNums[i] = convertStrToNum(bans[i]);
        }
        
        Arrays.sort(bansNums);
        for(long bn : bansNums) if(bn <= n) n++;
        
        answer = convertNumToStr(n);
        
        return answer;
    }

    private long convertStrToNum(String str) {
        int length = str.length();
        long num = 0;

        for(int j=0;j<length;j++) {
            num += (str.charAt(j)-96) * Math.pow(26,(length-1-j));
        }

        return num;    
    }
    private String convertNumToStr(long num) {
        String str = "";

        while(num > 0) {
            str = String.valueOf((char)((num-1)%26+1+96)) + str;
            num=(num-1)/26;
        }

        return str;
    }
}

 

 

문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/389481
728x90
반응형

+ Recent posts