반응형

2869번 문제 달팽이는 올라가고 싶다

예전에 틀려놓고 버려뒀던 문제...
그냥 구현만 했더니 시간제한이 0.15초인걸 보고 답없겠다 싶었는데...
이번엔 한번 시간써서 풀어보려한다
답도 대충 훑어봤었는데 이젠 풀겠지

글이 적어서 단순해보이지만 이런 문제일수록 규칙을 잘 봐야지..
범위 10억이면 int형으로 커버 가능하고 이제 남은건 수학적 계산 뿐...

 

------

hint

V에서 마지막 미끄러지는 부분은 계산하면 안됨

실행시간을 잘 봐야함

 

 

------

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.Scanner;
 
public class Main {
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int A, B, V;
        int tmp;
        
        A = sc.nextInt();
        B = sc.nextInt();
        V = sc.nextInt();
        
        //여기가 구현부
        tmp = (V - B)/(A - B);
        if((V - B)%(A - B)> 0) {
            tmp++;
        }
        System.out.println(tmp);
    }
}
cs

실행시간 - 108ms


답을 한번 봐서 그런가? 이건 너무 쉽게 풀어버렸음...
자바의 시간초과문제는 Java11 > Java8로 제출하니까 바로 통과됨
BufferedReader를 사용하면 된다고 하긴 하는데 이건 진짜 최후의 최후보루 같은 느낌
일단 구현이 목적이라 저거까지 사용할 여유가 없다..
그리고 자바11이 스캐너를 사용할 때 오래걸리는 문제로 어쩔 수 없다고 하는데... 이정돈 넘어가도 되지 않을까...?

 

반응형
반응형

2204번 문제 도비의 난독증 테스트

문제 난이도를 올렸더니 데이터 저장방식이 조금 더 까다로워진 듯 하다.
이번에도 ascii활용문제 조건 보고 데이터를 많이 저장할 필욘 없는 듯 하다. 최종적으로
사전상 가장 앞에 있는 단어 하나만 출력이니
종료조건 0을 잘 생각해서 구현해봐야겠다.
compare메서드 쓰면 편할거 같긴 한데 한번 직접 비교하는 코드 만들어서 해보기

 

-------


hint

while문 조건부에 입력받고 0이 아닐 때 반복 0을 입력 시 반복 종료
사전순인걸 기억해야함, 각 입력마다 사전순 앞의 값은 list에 add

-------

반응형

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
public class Main {
    
    public static void main(String[] args) {
        dicfirst dic = new dicfirst();
        Scanner sc = new Scanner(System.in);
        String first = new String();
        
        List<String> list = new ArrayList<String>(1000);
        int n;
        int count = 0;
        
        while((n = Integer.parseInt(sc.nextLine())) != 0) {
            
            String[] s = new String[n];
        
            for(int i = 0; i < n; i++) {
                s[i] = sc.nextLine();
            }
            first = s[0];
            //사전앞단어 구한 후 배열저장 or list저장
            //ascii A = 65 + 26(범위 65~90) / a = 95 + 26(범위 97~122)
            
            for(int i = 0; i < n; i++) {
                first = dic.go(first, s[i]);
            }
            
            list.add(first);//사전상 앞단어를 저장해둠
            count++;
        }
        for(int i = 0; i < count; i++) {
            System.out.println(list.get(i));
        }
 
    }
}
 
 
class dicfirst {
    
    String go(String a, String b){
        if(a != null) { // first문자열이 아직 저장되어있지 않다면 a는 null상태 - 바로 b return
            int count = 0;
            if(a.length() <= b.length()) {
                count = a.length();
            }
            else {
                count = b.length();
            }
            
            for(int i = 0; i < count; i++) {
                int compareOne = a.charAt(i);
                int compareTwo = b.charAt(i);
                if65 <= compareOne && compareOne <= 90) { // 대문자일 때 소문자로 변환 (+32)
                    compareOne += 32;
                }
                if65 <= compareTwo && compareTwo <= 90) { // 대문자일 때 소문자로 변환 (+32)
                    compareTwo += 32;
                }
                if(97 <= compareOne && compareOne <= 122 
                        && 97 <= compareTwo && compareTwo <= 122 ) {
                    if(compareOne < compareTwo) {return a;}
                    else if(compareOne > compareTwo) {return b;}//==미구현의도 : 같으면 다음 비교로 넘어가게끔 설계 
                }
            }
            if(a.length() <= b.length()) {
                return a;
            }
            else {
                return b;
            }
        }
        return b;
    }
}
cs

실행시간 - 264ms

구현 다했는데 사전순의 마지막 반례를 생각못해서 계속 틀렸다.

찾은 반례

 

2
aAab
aAa
0


사전 순이라는 것은 다른 길이지만 바로 앞까지 길이와 알파벳이 같을 때 길이가 짧은 단어가 사전의 앞에 놓인다는 것을 말하는데, 이 부분을 놓쳤었다.
예를 들어, aaa aaaa가 있다고 가정했을 때 aaa와 aaaa는 세번째 자리까지는 같은 알파벳이지만, 뒤의 한글자로 단어의 길이가 나뉘는데 해당 부분을 해결하는 코드를 추가하자마자 문제해결이 되었다.
물론 코드는 그냥 돌아가게만 만들어둠..... 처리속도 등수 보니까 자바에서 거의 최하위권 ㅋㅋㅋ...

반응형
반응형

4447번 문제 좋은놈 나쁜놈

 

생각

ascii코드활용 65+ 26 / 97 + 26/
b와 g의 개수에 따라서 하면됨
예전에 했던 문제 1157이랑 비슷한 느낌으로 하면 될듯?
문자는 25자를 넘지않음.
nextline
String으로 받고

for문으로 배열들
charat을 통해 쭉 비교하면 되긴 하는데
이게 효율적일지는 모르겠음
일단구현부터!

 

----------

hint

 

nextInt() 이후 nextLine()을 사용한다면 입력의 오류에 주의할 것,

매 for문마다 good과 bad를 판단해 배열에 문자열을 추가해 저장

 

----------

Solution

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.util.Scanner;
 
public class Main {
    
    public static void main(String[] args) {
        int[] goodAndBad = new int[2]; // 0 = good, 1 = bad
        Scanner sc = new Scanner(System.in);
        int n;
        n = Integer.parseInt(sc.nextLine());
        check c = new check();
        
        String[] s = new String[n];
    
        for(int i = 0; i < n; i++) {    
            s[i] = sc.nextLine(); //nextInt()를 사용 시 s[0]에 '' 저장 주의
        }
        
        for(int i = 0; i < n; i++) {
            goodAndBad[0= 0;
            goodAndBad[1= 0;
            for (int j = 0; j < s[i].length(); j++) {
                if((int)s[i].charAt(j) == 103) { // g == 103 , G == 71
                    goodAndBad[0]++;
                }
                else if((int)s[i].charAt(j) == 71) { 
                    goodAndBad[0]++;
                }
                else if((int)s[i].charAt(j) == 98) {// b == 98, B == 66
                    goodAndBad[1]++;
                }
                else if((int)s[i].charAt(j) == 66) { 
                    goodAndBad[1]++;
                }
            }
            s[i] = s[i].concat(c.goodOrBad(goodAndBad));
        }
        for(int i = 0; i < n; i++) {
            System.out.println(s[i]);
        }
    }
}
 
class check {
     String goodOrBad(int[] a) {
            if(a[0> a[1]) {
                return " is GOOD";
            }
            else if(a[0< a[1]) {
                return " is A BADDY";
            }
            else if(a[0== a[1]) {
                return " is NEUTRAL";
            }
            return "error";
        }
}
cs

실행시간 - 200ms

 

전에 조금 더 어려웠던 문제(no.1157)를 풀어봐서 구현은 쉬웠다.

그런데 hint에 적었던 nextInt()사용 후 nextLine()을 사용했을 때 문제가 생겨서 해당 문제를 해결하는데 시간이 좀 걸렸고,

결과적으로 해결해서 지식이 늘어난 느낌도 좋고 좋은 경험 한거같다.

 

해당 문제 관련 정리 : nextInt()입력 후 nextLine()사용 시 주의점

반응형
반응형

nextint() 입력 후 nextLine()을 사용 시에 입력관련 오류가 생긴다.

 

이유는 콘솔 입력시에 엔터키를 입력 했을 때만 지금까지 눌렀던 내용이 버퍼에 전달되어 저장이 되는데, nextInt의 메서드

는 int값만 가져간 후 구분자를 받지 않는다.

때문에 이후 \n의 구분자를 통해 입력을 구분하는 nextLine메서드를 사용할 경우 해당 부분에서 문제가 생긴다. nextLine의 첫번째 입력을''\n의 상태로 입력을 받는 것이다.

 

아래는 해당 부분의 코드 예제이다.

1
2
3
4
5
6
7
8
9
        Scanner sc = new Scanner(System.in);
        int n;
        n = sc.nextInt();
        
        String[] s = new String[n];
            
        for(int i = 0; i < n; i++) {    
            s[i] = sc.nextLine(); // 이 부분에서 s[0]에 ''가 저장이된다.
        }
cs

이러한 오류를 해결할 방법은 알아본 바로는 두가지가 있는데,

 

첫번째는 

1
2
3
4
5
6
7
8
9
10
        Scanner sc = new Scanner(System.in);
        int n;
        n = sc.nextInt();
        sc.nextLine();//해당부분 줄     
        
        String[] s = new String[n];
            
        for(int i = 0; i < n; i++) {    
            s[i] = sc.nextLine(); // 이 부분에서 s[0]에 ''가 저장이된다.
        }
cs

이렇게 nextLine()을 한줄 추가해서 방지하는 것과

 

 

1
2
3
4
5
6
7
8
9
        Scanner sc = new Scanner(System.in);
        int n;
        n = n = Integer.parseInt(sc.nextLine());//nextLine을 사용해서 int형식 
        
        String[] s = new String[n];
            
        for(int i = 0; i < n; i++) {    
            s[i] = sc.nextLine(); // 이 부분에서 s[0]에 ''가 저장이된다.
        }
cs

위와 같이 아예 nextLine()을 통해 int형을 입력받는 방법이다.

 

가장 깔끔한 방법은 두번째 방법인 듯 하다.

 

문제풀다가 멘붕와서 서치한 내용을 토대로 정리 완!

 

요약 : nextInt에는 \n의 개행문자가 들어가지 않음. 때문에 다음 nextLine사용 시 해당 enter(\n)구분자를 가져가기에
nextLine을 바로 아랫줄에 넣어 초기화 시켜주거나 Integer.parseInt(sc.nextLine());의 형식으로 입력을 받아야 함

반응형

'공부 > Java' 카테고리의 다른 글

우테코 프리코스 6기 1주차 숫자야구 회고  (0) 2023.10.26
자바의정석 ch14 람다와 스트림  (0) 2023.09.18
BufferedReader, StringTokenizer  (0) 2023.01.14
반응형

13458번 문제 시험 감독

 

생각
범위는 전부 백만
첫째줄 시험장의 개수N입력받고
둘째줄N을 통해 for문돌려서 시험장에 있는 응시자 수 입력받고
셋째줄 B와 C를 배열0,1에 입력받음
이후 알고리즘이 들어간다.

 

-----

hint

총 시험응시자 수를 나눠 몫과 나머지를 활용한다. / 입력조건을 잘 보고 자료형을 고민해야함

 

 

-----

Solution

반응형

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        int N;
        int[] testCapa = new int[1000000];
        int[] supervisor = new int[2]; // 감독관
        int tmp;
        int remainder; // 나머지
        int quotient; // 몫
        long count = 0;
        Scanner sc = new Scanner(System.in);
 
        N = sc.nextInt();
 
        for (int i = 0; i < N; i++) {
            testCapa[i] = sc.nextInt();
        }
 
        supervisor[0= sc.nextInt(); // 총감독관
        supervisor[1= sc.nextInt(); // 부감독관
 
        // 필요한 감독관 수의 최솟값을 만들기.
 
        for (int i = 0; i < N; i++) {
            tmp = testCapa[i];
            tmp -= supervisor[0];
            if (tmp < 1) { // tmp가 총감독관으로 끝날 때
                count++;
                continue;
            }
            else if (tmp > 0) { // tmp가 총감독관으로 안 끝날 때
                count++;
                remainder = tmp % supervisor[1];
                quotient = tmp / supervisor[1];
                
                count += quotient;
                
                if (remainder > 0) { // 나머지가 있으면 부감독관 한명 더 있어야함
                    count++;
                }
            }
        }
        System.out.println(count);
    }
}
 
cs

구현 자체는 오래 생각해서 그런지 쉽게 구현했고,
이번에도 너무 생각을 짧게 하고 구현했는지, 조건 부분에서 두번이나 틀렸었다.

1트 - count를 남발 중복적용으로 인해 오답
2트 - 똑같이 조건이 아쉬움 count가 잘못적용됨
3트 - 모든 예제가 맞게끔 잘 적용 되었는데 자꾸틀림 질문게시판의 반례도 찾아봤지만, 모든 반례가 맞음
4트 - 바보같은 실수를 한 것을 깨달았음... 카운트 횟수는 100만*100만으로 int형의 42억으로는 감당을 하지 못해서 에러가 난 것이였음. 이후 count변수의 자료형을 long으로 변경 후 정답
실행시간 - 1712ms ///정답율 28.2%인게 다들 똑같은 실수 한거같음....

 

 

			if (tmp < 1) { // tmp가 총감독관으로 끝날 때
				count++;
				continue;
			}

5트 - 시간이 너무 오래걸림... 최대 100만번 for문을 돌리니 그럴 수밖에 없던 문제인듯함

때문에 조건을 달았었음 총 감독관으로 해당 시험장이 끝난다면 바로 종료되게끔 continue문을 넣어서 실행해봄 1712에서 아주아주 약간 줄었음.
실행시간 - 1688ms

 


그냥 내 효율적이지 못한 알고리즘이 문제인거 같다....
일단 구현에는 성공했으니 찝찝한 기분 안아두고 킵
당장 생각할 수 있는거는 BufferReader밖에 없는데 그거하나 넣는다고 드라마틱하게 바뀔거 같지 않음

반응형
반응형

15953번 문제 상금헌터


처음에 문제가 길어서 무서웠는데 생각보다 별거없던 문제
아직 티어가 낮아서 할만한거만 나오는듯

생각
1회 100명중 21명에게 상금부여
2회 64명중 31명에게 상금부여

각 등수에 맞는 명수로 조건걸고 조건에 따라서 상금을 더해 배열에 저장

 

-------

hint

 

배열은 [1000]
첫줄입력 : 가정횟수 t 1이상 1000이하
t의 갯수만큼 : 두개의 정수 100이하 / 64이하

1회차 : 1 3 6 10 15 21

2회차 : 1 3 7 15 31

--------

반응형

Solution

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import java.util.Scanner;
 
public class Main {
 
    static int prize(int a, int b){
        int[] prizeOne = {500000030000002000000500000300000100000};
        int[] prizeTwo = {512000025600001280000640000320000};
        int prize = 0;
        
        if(a <= 21) {
            if(a == 1) {
                prize += prizeOne[0];
            }else if(a <= 3 && a > 1) {
                prize += prizeOne[1];
            }else if(a <= 6 && a > 3) {
                prize += prizeOne[2];
            }else if(a <= 10 && a > 6) {
                prize += prizeOne[3];
            }else if(a <= 15 && a > 10) {
                prize += prizeOne[4];
            }else if(a <= 21 && a > 15) {
                prize += prizeOne[5];
            }
        }
        if(b <= 31) {
            if(b == 1) {
                prize += prizeTwo[0];
            }else if(b <= 3 && b > 1) {
                prize += prizeTwo[1];
            }else if(b <= 7 && b > 3) {
                prize += prizeTwo[2];
            }else if(b <= 15 && b > 7) {
                prize += prizeTwo[3];
            }else if(b <= 31 && b > 15) {
                prize += prizeTwo[4];
            }
        }
        
        if(prize > 0) {
            return prize;
        }
        return 0;
    }
    
    public static void main(String[] args) {
        int[] arr = new int[1000];
        int count = 0;
        int t = 0;
        int a = 0;
        int b = 0;
        Scanner sc = new Scanner(System.in);
        
        t = sc.nextInt();
        
        for(int i = 0; i < t; i++) {
            a = sc.nextInt();
            b = sc.nextInt();
            
            arr[i] = prize(a, b);
            count++;
        }
        
        for(int i = 0; i < count; i++) {
            System.out.println(arr[i]);
        }    
    }
}
 
cs


첫번째 런타임에러 - 배열범위를 100으로 만들었었음. 조건 확인 잘하기
두번째 실패 - cashprize의 범위설정을 잘못했음. 범위 명확히 조절함
세번째 성공 - 속도 344ms 겁나느림.(클래스 생성해서 계산메소드를 만들었는데 이게 느린거같아 수정해봤음)
네번째 성공 - 속도 340ms 메서드를 같은 클래스 내에 지정해서 static선언 후 돌려봄 ㅋㅋㅋ이게 차이가 있는건지 모르겠음

 

 

 

 

 

 

이정도면 티어 한단계만 올려볼까..?

 

반응형
반응형

10886번 문제 0 = not cute / 1 = cute


생각
n을 처음에 입력을 받고
이후 n개만큼 for문을 돌려 정수를 넣는다 0(귀엽지않다)과 1(귀엽다)로 입력
이후 0 과 1의 수를 어케비교할까 했는데 배열을 2개 만들어서 각각을 0으로 초기화 후
투표를 통해 해당 배열의 수를 ++해주는 것으로 해결하면 될 듯하다.

동표일 경우를 생각했는데 조건에 n은 홀수라 되어있음.

 

-------

 

구현이 쉬웠다 acm호텔이랑 분명 같은 난이돈데... 아직 초보인 나에게도 쉽다느껴질 정도

 

hint - 2개의 배열칸에 카운팅

 

-------

반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        int n;
        int pick;
        Scanner sc = new Scanner(System.in);
        int[] vote = {0,0};
        
        n = sc.nextInt();
        
        for(int i = 0; i < n; i++) {
            vote[sc.nextInt()]++;
        }
        
        if(vote[0> vote[1]) {
            System.out.println("Junhee is not cute!");
        }
        else {
            System.out.println("Junhee is cute!");
        }
    }
}
cs

 

반응형
반응형

10250번 문제 acm 호텔


음... 기초적인 구현은 했는데 자꾸 틀렸다나와서 고민을 너무 짧게했음 다음엔 좀 더 생각하기.
그리고 해당 문제풀이에 있어서 쓸데없이 조건을 붙이고 해결했는데 이게 맞는건지 다른 글을 봐야할듯

 

-------
다른 글 확인 결과 - 내가 생각한 조건이 맞았다. 이 블로그에서 서술한 방식이 한가지가 더 있었는데,
알고리즘에서 자주보이는 Scanner입력방식이 아닌 BufferedReader방식이다.
이 방식은 구현하기에 급급한 내겐 아직이라 생각되니 다음 기회에

 

hint - n번째손님 % 층 == 0 의 조건

 

이것도 안된다 싶으면 최종으로 문제확인

 

--------------------

반응형
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Main {
 
    public static void main(String[] args) {
        String[] s = new String[1000];
        int t; // n개의 테스트데이터
        int h, w, n; // 한 행의 테스트데이터 각각 호텔의 층, 방, 몇번째 손님인지를 나타냄
        Scanner sc = new Scanner(System.in);
        int num;
        int floor;
        t = sc.nextInt();
        int count = 0;
        
        for(int i = 0; i < t; i++) {
                num = 0;
                floor = 0;
                h = sc.nextInt();
                w = sc.nextInt();
                n = sc.nextInt();
                //알고리즘구현부분
                num = n / h + 1;
                if(n%h == 0) {
                    floor = h;
                    num = num - 1;
                }else floor = n % h;
                if (num >  9) {
                    s[i] = floor + "" + "" + num;
                }
                else s[i] = floor + "" + 0 + "" + num;
                count++;
        }
        for(int i = 0; i < count; i++) {
            System.out.println(s[i]);
        }
    }
}
cs
반응형

+ Recent posts