# 문제 출제 사이트

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

 

11382번: 꼬마 정민

첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 1012)이 공백을 사이에 두고 주어진다.

www.acmicpc.net

 

# 문제

꼬마 정민이는 이제 A + B 정도는 쉽게 계산할 수 있다.

이제 A + B + C를 계산할 차례이다!

 

# 입력

첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 1012)이 공백을 사이에 두고 주어진다.

 

# 출력

A+B+C의 값을 출력한다.

 

 

# 제출한 소스코드

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    long a = sc.nextLong();
    long b = sc.nextLong();
    long c = sc.nextLong();

    System.out.println(a + b + c);
  } 
}
  • 입력되는 값을 int로 받으면 런타임 에러가 발생해서 long으로 받도록 구현했다.
반응형

# 문제 출제 사이트

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

 

10699번: 오늘 날짜

서울의 오늘 날짜를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

# 문제

서울의 오늘 날짜를 출력하는 프로그램을 작성하시오.

 

# 입력

입력은 없다.

 

# 출력

서울의 오늘 날짜를 "YYYY-MM-DD" 형식으로 출력한다.

 

 

# 제출한 소스코드

public class Main {
  public static void main(String[] args) {
      System.out.println("2022-11-30");
  } 
}
  • 오늘 날짜를 그냥 출력한 것

 

 

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Main {
  public static void main(String[] args) {
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("YYYY-MM-dd");
		df.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"));
		System.out.println(df.format(date));
  } 
}
  • 자바의 날짜 함수를 사용해서 출력한 것

 

# 참고자료

반응형

# 문제 출제 사이트

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

 

2566번: 최댓값

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.

www.acmicpc.net

 

# 문제

<그림 1>과 같이 9×9 격자판에 쓰여진 81개의 자연수 또는 0이 주어질 때,

이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.

예를 들어, 다음과 같이 81개의 수가 주어지면

이들 중 최댓값은 90이고, 이 값은 5행 7열에 위치한다.

 

 

# 입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다.

주어지는 수는 100보다 작은 자연수 또는 0이다.

 

# 출력

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다.

최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.

 

 

# 제출한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st;

    int maxNum = -1;
    String result = "";
    for ( int i = 1; i <= 9; i++ ) {
        st = new StringTokenizer(br.readLine());
        for ( int j = 1; j <= 9; j++ ) {
            int tempNum = Integer.parseInt(st.nextToken());
            if ( tempNum > maxNum) {
              maxNum = tempNum;
              result = i + " " + j;
            }
        }
    }

    System.out.println(maxNum + "\n" + result);
  } 
}
  • 9x9 격자판의 수가 모두 0일 경우의 수를 생각하지 못하고 maxNum 변수에 초기값으로 0일 넣었었다.
    위 제출한 코드에서는 maxNum 변수를 -1로 초기값을 할당해 문제를 해결할 수 있게 되었다.

 

반응형

# 문제 출제 사이트

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

 

2563번: 색종이

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변

www.acmicpc.net

 

# 문제

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.

 

 

# 입력

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다.

색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다.

색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다

 

 

# 출력

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.

 

 

# 제출한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());
    StringTokenizer st;

    int[][] numArr = new int[101][101];
    for ( int i = 0; i < n; i++ ) {
        st = new StringTokenizer(br.readLine());
        int x = Integer.parseInt(st.nextToken());
        int y = Integer.parseInt(st.nextToken());

        for ( int j = x; j < x + 10; j++ ) {
            for ( int k = y; k < y + 10; k++ ) {
                numArr[j][k] = 1;
            }
        }
    }

    int result = 0;
    for ( int i = 0; i < 101; i++ ) {
        for ( int j = 0; j < 101; j++ ) {
            result += numArr[i][j];
        }
    }

    System.out.println(result);
  }
}

 

# 참고자료

 

반응형

# 문제 출제 사이트

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

 

2743번: 단어 길이 재기

알파벳으로만 이루어진 단어를 입력받아, 그 길이를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

# 문제

알파벳으로만 이루어진 단어를 입력받아, 그 길이를 출력하는 프로그램을 작성하시오.

 

# 입력

첫째 줄에 영어 소문자와 대문자로만 이루어진 단어가 주어진다.

단어의 길이는 최대 100이다.

 

# 출력

첫째 줄에 입력으로 주어진 단어의 길이를 출력한다.

 

 

# 제출한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println(br.readLine().length());
  }
}

 

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    char[] charArr = br.readLine().toCharArray();
    System.out.println(charArr.length);
  }
}
  • 자바 length() 함수가 어떻게 구현되는지 확인해보니 character 배열의 length를 가져오는 방식으로 되어 있었다.
반응형

# 문제 출제 사이트

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

 

2738번: 행렬 덧셈

첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같

www.acmicpc.net

 

# 문제

N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.

 

# 입력

첫째 줄에 행렬의 크기 N 과 M이 주어진다.

둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다.

이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다.

N과 M은 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.

 

# 출력

첫째 줄부터 N개의 줄에 행렬 A와 B를 더한 행렬을 출력한다.

행렬의 각 원소는 공백으로 구분한다.

 

 

# 제출한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        int[][] numArr = new int[n][m];

        for ( int i = 0; i < 2; i++ ) {		// 2개의 행열을 입력 받는다.
            for ( int j = 0; j < n; j++ ) {	// n 개의 행을 입력 읽는다.
                st = new StringTokenizer(br.readLine());
                for ( int k = 0; k < m; k++ ) {	// n번째 줄의 m번째 열
                    if ( i == 1 ) {				// B 번째 행열을 입력 받으면 기존 A 행열에 더한다.
                        numArr[j][k] = numArr[j][k] + Integer.parseInt(st.nextToken());
                    } else {					// A 번째 행열을 입력 받는다.
                        numArr[j][k] = Integer.parseInt(st.nextToken());
                    }
                }
            }
        }

        for ( int i = 0; i < n; i++ ) {
            for ( int j = 0; j < m; j++ ) {
                System.out.print(numArr[i][j] + " ");
            }
            System.out.println();
        }
    }
}
  • 의식의 흐름대로 작성한 코드, 너무 투박하고 코드가 복잡해 보인다.
  • 2차원 배열 정수를 입력 받기 위해 numArr 이라는 2차원 배열을 선언했다.
  • 3중 for문을 사용해서 A 와 B의 행열을 입력 받고 더하는 로직을 구현했다.
  • 2중 for문을 사용해서 덧셈이 완료된 행열을 출력했다.

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        int[][] numArr = new int[n][m];

        for ( int i = 0; i < 2; i++ ) {
            for ( int j = 0; j < n; j++ ) {
                st = new StringTokenizer(br.readLine());
                for ( int k = 0; k < m; k++ ) {
                        numArr[j][k] += Integer.parseInt(st.nextToken());
                }
            }
        }

        for ( int i = 0; i < n; i++ ) {
            for ( int j = 0; j < m; j++ ) {
                System.out.print(numArr[i][j] + " ");
            }
            System.out.println();
        }
    }
}
  • 3중 for문 안에 있던 if문 제거

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        int[][] numArr = new int[n][m];

        for ( int i = 0; i < 2; i++ ) {
            for ( int j = 0; j < n; j++ ) {
                st = new StringTokenizer(br.readLine());
                for ( int k = 0; k < m; k++ ) {
                        numArr[j][k] += Integer.parseInt(st.nextToken());
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        for ( int i = 0; i < n; i++ ) {
            for ( int j = 0; j < m; j++ ) {
                sb.append(numArr[i][j] + " ");
            }
            sb.append("\n");
        }
        System.out.println(sb.toString());
    }
}
  • StringBuilder를 사용해서 출력을 해봤다.
반응형

# 문제 출제 사이트

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

 

11651번: 좌표 정렬하기 2

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

 

# 문제

2차원 평면 위의 점 N개가 주어진다.

좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

 

# 입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 

둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다.

(-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

 

# 출력

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

 

# 제출한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st;
    int n = Integer.parseInt(br.readLine());

    int[][] intArr = new int[n][2];
    for ( int i = 0; i < n; i++ ) {
        st = new StringTokenizer(br.readLine());
        intArr[i][0] = Integer.parseInt(st.nextToken());
        intArr[i][1] = Integer.parseInt(st.nextToken());
    }
    
    Arrays.sort(intArr, (e1, e2) -> {
        if ( e1[1] != e2[1] ) {
            return e1[1] - e2[1];
        } else {
            return e1[0] - e2[0];
        }
    });


    StringBuilder sb = new StringBuilder();
    for(int j = 0 ; j< n ; j++) {
        sb.append(intArr[j][0] + " " + intArr[j][1]).append('\n');
    }
    System.out.println(sb);
  }
}
  • 11650번 문제를 풀면 쉽게 풀 수 있는 문제
  • 문제를 제대로 읽고 문제를 풀자!
    • 문제를 제대로 안 읽고 문제를 풀다가 시간이 꽤 걸렸다.

 

# 참고자료

  • 블로그 Stranger's LAB => 링크
반응형

# 문제 출제 사이트

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

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

 

# 문제

2차원 평면 위의 점 N개가 주어진다.

좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

 

# 입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다.

둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다.

(-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

 

# 출력

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

 

 

# 제출한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    String[] strArr = new String[n];
    for ( int i = 0; i < n; i++ ) {
        strArr[i] = br.readLine();
    }

    Arrays.sort(strArr, new Comparator<String>() {
        @Override
        public int compare(String str1, String str2) {
            String[] str1Arr = str1.split(" ");
            String[] str2Arr = str2.split(" ");
            
            if ( !str1Arr[0].equals(str2Arr[0])) {
                return Integer.parseInt(str1Arr[0]) - Integer.parseInt(str2Arr[0]);
            } else {
                return Integer.parseInt(str1Arr[1]) - Integer.parseInt(str2Arr[1]);
            }
        }
    });
    
    
    for (String str : strArr ) {
        System.out.println(str);
    }
  }
}
  • 다른 자료 참고 안하고 직접 풀어본 방법
  • Arrays.sort에서 compare를 @override해서 사용해봤다.
  • 시간 2404ms 로 상당히 느리게 나왔다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    int[][] intArr = new int[n][2];
    for ( int i = 0; i < n; i++ ) {
        String[] tempArr = br.readLine().split(" ");
        intArr[i][0] = Integer.parseInt(tempArr[0]);
        intArr[i][1] = Integer.parseInt(tempArr[1]);
    }

    Arrays.sort(intArr, (e1, e2) -> {
        if ( e1[0] != e2[0] ) {
            return e1[0] - e2[0];
        } else {
            return e1[1] - e2[1];
        }
    });

    for ( int j = 0; j < n; j++ ) {
        System.out.println(intArr[j][0] + " " + intArr[j][1]);
    }
  }
}
  • 2차원 int 배열로 번경해서 해봤다.
  • Arrays.sort 부분에 람다식을 사용해서 문제를 풀어봤다.
  • 시간 1580ms 로 전에 제출한 것보다 훨씬 빨라졌다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st;
    int n = Integer.parseInt(br.readLine());

    int[][] intArr = new int[n][2];
    for ( int i = 0; i < n; i++ ) {
        st = new StringTokenizer(br.readLine());
        intArr[i][0] = Integer.parseInt(st.nextToken());
        intArr[i][1] = Integer.parseInt(st.nextToken());
    }

    Arrays.sort(intArr, (e1, e2) -> {
        if ( e1[0] != e2[0] ) {
            return e1[0] - e2[0];
        } else {
            return e1[1] - e2[1];
        }
    });

    for ( int j = 0; j < n; j++ ) {
        System.out.println(intArr[j][0] + " " + intArr[j][1]);
    }
  }
}

 

  • 한줄에 입력되는 문자열을 split(" ") 함수를 사용해서 공백을 잘랐는데 StringTokenizer를 사용해 봤다.
  • 시간은 1400ms 가 나왔다.

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
  public static void main(String[] args) throws IOException {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st;
      int n = Integer.parseInt(br.readLine());

      int[][] intArr = new int[n][2];
      for ( int i = 0; i < n; i++ ) {
          st = new StringTokenizer(br.readLine());
          intArr[i][0] = Integer.parseInt(st.nextToken());
          intArr[i][1] = Integer.parseInt(st.nextToken());
      }

      Arrays.sort(intArr, (e1, e2) -> {
          if ( e1[0] != e2[0] ) {
              return e1[0] - e2[0];
          } else {
              return e1[1] - e2[1];
          }
      });

      StringBuilder sb = new StringBuilder();
      for(int j = 0 ; j< n ; j++) {
          sb.append(intArr[j][0] + " " + intArr[j][1]).append('\n');
      }
      System.out.println(sb);
  }
}
  • 프린트 함수를 사용하지 않고 StringBuilder를 사용해서 출력을 해봤다.
  • 시간 744ms 가 나왔다.

 

# 참고자료

  • 블로그 Stranger's LAB => 링크

 

반응형

# 문제 출제 사이트

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

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

 

# 문제

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다.

이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.

 

# 입력

첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)

둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다.

나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고,

길이가 100보다 작거나 같은 문자열이다.

입력은 가입한 순서로 주어진다.

 

# 출력

첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순,

나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.

 

 

# 제출한 소스코드

더보기

 

1. 런타임에러1(NumberFormat)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    String[] strArr = new String[n];
    for ( int i = 0; i < n; i++ ) {
        strArr[i] =  br.readLine();
    }

    Arrays.sort(strArr, new Comparator<String>() {
      @Override
      public int compare(String str1, String str2) {
        int num1 = Integer.parseInt(str1.substring(0, 2));
        int num2 = Integer.parseInt(str2.substring(0, 2));
    
        if ( num1 < num2 ) {
            return num1 - num2;
        }
    
        return 0;
      }
    });
    
    for ( String str : strArr ) {
        System.out.println(str);
    }
  }
}

 

 2. 런타임에러2(NumberFormat)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    String[] strArr = new String[n];
    for ( int i = 0; i < n; i++ ) {
        strArr[i] =  br.readLine();
    }

    Arrays.sort(strArr, new Comparator<String>() {
      @Override
      public int compare(String str1, String str2) {
        int num1 = Integer.parseInt(str1.substring(0, 3).trim());
        int num2 = Integer.parseInt(str2.substring(0, 3).trim());
    
        if ( num1 < num2 ) {
            return num1 - num2;
        }
    
        return 0;
      }
    });
    
    for ( String str : strArr ) {
        System.out.println(str);
    }
  }
}

 

 

3. 틀린 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    String[] strArr = new String[n];
    for ( int i = 0; i < n; i++ ) {
        strArr[i] =  br.readLine();
    }

    Arrays.sort(strArr, new Comparator<String>() {
      @Override
      public int compare(String str1, String str2) {
          int num1 = Integer.parseInt(str1.split(" ")[0]);
          int num2 = Integer.parseInt(str2.split(" ")[0]);
    
        if ( num1 < num2 ) {
          return num1 - num2;
        }
    
        return 0;
      }
    });
    
    for ( String str : strArr ) {
        System.out.println(str);
    }
  }
}

 

 

1. 성공한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    String[] strArr = new String[n];
    for ( int i = 0; i < n; i++ ) {
        strArr[i] =  br.readLine();
    }

    Arrays.sort(strArr, new Comparator<String>() {
      @Override
      public int compare(String str1, String str2) {
        int num1 = Integer.parseInt(str1.split(" ")[0]);
        int num2 = Integer.parseInt(str2.split(" ")[0]);

        return num1 - num2;
      }
    });
    
    for ( String str : strArr ) {
        System.out.println(str);
    }
  }
}

 

 

# 참고자료

  • 블로그 Stranger's LAB => 링크
반응형

# 문제 출제 사이트

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

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

 

# 문제

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

 

# 입력

첫째 줄에 단어의 개수 N이 주어진다.

(1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다.

주어지는 문자열의 길이는 50을 넘지 않는다.

 

# 출력

조건에 따라 정렬하여 단어들을 출력한다.

단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.

 

 

# 제출한 소스코드

더보기

1. 글자수에 맞게 정렬되고 중복은 제거 되었지만, 길이가 같으면 사전순으로 정렬해야하는데 못한 것

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedHashSet;
import java.util.List;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());


    String[] strArr = new String[n];
    int[] numArr = new int[n];
    for ( int i = 0; i < n; i++ ) {
      String tempStr = br.readLine();
      strArr[i] = tempStr;
      numArr[i] = tempStr.length();
    }

    for ( int j = 0; j < n; j++ ) {
      for ( int k = 0; k < n; k++ ) {
        if ( numArr[j] < numArr[k] ) {
          int tempNum = numArr[k];
          numArr[k] = numArr[j];
          numArr[j] = tempNum;
          
          String tempStr = strArr[k];
          strArr[k] = strArr[j];
          strArr[j] = tempStr;
        }
      }
    }
    
    LinkedHashSet<String> hashSet = new LinkedHashSet<>(List.of(strArr));
    for ( String str : hashSet ) {
       System.out.println(str);
    }
  }
}
  • 1시간 가량 고민하다가 결국 제출했는데 글자수에 맞게 정렬하고 중복도 제거했지만 하나의 조건을 못 맞췄다.
  • 결국 오늘도 Stranger's LAB 블로그를 보고 아래의 방식대로 문제를 풀게 되었다.

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.List;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    String[] strArr = new String[n];
    for ( int i = 0; i < n; i++ ) {
        strArr[i] = br.readLine();
    }

    Arrays.sort(strArr, new Comparator<String>() {
        @Override
        public int compare(String str1, String str2) {
    
            if ( str1.length() == str2.length() ) {
                return str1.compareTo(str2);
            } else {
                return str1.length() - str2.length();
            }
        }
    });
    
    LinkedHashSet<String> hashSet = new LinkedHashSet<>(List.of(strArr));
    for ( String str : hashSet ) {
       System.out.println(str);
    }
  }
}
  • Arrays.sort 에 Compare 함수를 Override 해서 사용할 방법은 진짜 생각도 못했다.
    * Stranger's LAB의 블로그를 보고 해당 코드를 작성했다.
  • 위 코드는 LinkedHashSet을 사용해서 중복된 글자를 제거했다.
    • HashSet을 사용해서 중복을 제거할려고 했지만 순서가 뒤바뀌었다.
      => HashSet과 LinkedHashSet의 차이점 => 링크

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    String[] strArr = new String[n];
    for ( int i = 0; i < n; i++ ) {
        strArr[i] = br.readLine();
    }

    Arrays.sort(strArr, new Comparator<String>() {
        @Override
        public int compare(String str1, String str2) {
    
            if ( str1.length() == str2.length() ) {
                return str1.compareTo(str2);
            } else {
                return str1.length() - str2.length();
            }
        }
    });


    System.out.println(strArr[0]);
    for ( int j = 1; j < strArr.length; j++ ) {
      
      if ( !(strArr[j].equals(strArr[j - 1])) ) {
          System.out.println(strArr[j]);
      }
    }
  }
}
  • 굳이 LinkedHashSet 을 사용해서 정렬할 필요가 없었다.
    j 인덱스의 글자와 j - 1 인덱스의 글자가 같으면 출력을 안하면 되는 것이었다.

 

 

# 참고자료

  • 블로그 Stranger's LAB => 링크
반응형

+ Recent posts