내일 진행되는 카카오 블라인드 테스트의 데모 테스트를 풀면서 드는 생각을 기록삼아 정리해 보았습니다.

카카오 블라인드 테스트는 Programmers라는 플랫폼에서 진행되는데 시험 전 테스트 환경을 경험해 볼 수 있게 간단한 데모 테스트를 제공해 줍니다. 별 찍기와 같은 기초적인 문제이지만 괜히 이런 문제도 잘 풀어야 될 것 같은 마음에 조금 고민하면서 풀어보았습니다. 혹시 더 좋은 방법을 알고 계신다면 댓글로 한 수 부탁드립니다!

테스트 1

문제 설명

직사각형을 만드는 데 필요한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 구하려고 합니다. 점 3개의 좌표가 들어있는 배열 v가 매개변수로 주어질 때, 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 return 하도록 solution 함수를 완성해주세요. 단, 직사각형의 각 변은 x축, y축에 평행하며, 반드시 직사각형을 만들 수 있는 경우만 입력으로 주어집니다.

제한사항

  • v는 세 점의 좌표가 들어있는 2차원 배열입니다.
  • v의 각 원소는 점의 좌표를 나타내며, 좌표는 [x축 좌표, y축 좌표] 순으로 주어집니다.
  • 좌표값은 1 이상 10억 이하의 자연수입니다.
  • 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 [x축 좌표, y축 좌표] 순으로 담아 return 해주세요.

입출력

v result
{{1, 4}, {3, 4}, {3, 10}} {1, 10}
{{1, 1}, {2, 2}, {1, 2}} {2, 1}

내가 푼 방법

class Solution {
    public int[] solution(int[][] v) {
        int missingX = v[0][0] ^ v[1][0] ^ v[2][0];
        int missingY = v[0][1] ^ v[1][1] ^ v[2][1];
        int[] answer = new int[]{missingX, missingY};
        return answer;
    }
}

작년에 처음 이 데모 테스트를 접했을 때 덧셈과 뺄셈으로 풀어보려고 했던 기억이 납니다. 그럴 필요 없이 XOR을 통해 짝이 맞지 않는 값을 찾을 수 있었습니다. 결과 배열을 생성하는데 더 빠른 방법이 있지 않을까 고민이 됩니다.

테스트 2

문제 설명

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.

제한조건

  • n과 m은 각각 1000 이하인 자연수입니다.

입출력

> 5 3
*****
*****
*****

내가 푼 방법

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();

        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < a; i++) {
            builder.append("*");
        }
        String stars = builder.toString();
        for (int i = 0; i < b; i++) {
            System.out.println(stars);
        }
    }
}

한 행을 만드는 과정에서 Scanner를 통해 출력을 추가하는 것 보다 StringBuilder로 행을 완성하는게 더 빠를 것 같아 사용해 보았습니다. 실행 시간의 경우 150ms~170ms 정도 걸렸고 일반적인 이중 for문의 경우 150ms 부터 320ms 까지 걸리는 테스트도 있는 걸로 보아 행과 열이 커질수록 차이가 많이 날 듯 합니다. StringBuilder 대신 Stream을 써보기도 했는데 결과는 StringBuilder와 비슷했습니다.

String stars = Stream.generate(() -> "*").limit(a).collect(Collectors.joining());