어떤 코드를 써야만 줄을 바꿀 수 있습니까?

줄 바꿈 코드 정보

  • 좋은 성적을 거두었지만 분산된 제시가격만 받았다

  • 어느 대답이든 일정한 범위 내의 코드에 수렴되기 때문에 구분할 수 없다(홍보기능)
  • 이런 거, 약간 부정적인?이런 의견이 있습니다.
    이 의견에 관해서도 동의할 만한 점이 있지만, 나 자신은

  • 전업 서비스에서 돈을 함부로 쓰지 않는 오퍼를 몇 개 받았다
  • 탐사에 의해 답변에 사용된 알고리즘이 언급되었는데, 사실상 코드를 자세히 볼 수 있는 기업이 존재한다(일부일 수도 있다)

  • 같은 알고리즘을 사용한 대답이라도 응답자에 따라 코드의 예쁨/더러움이 명확하게 분리된다
  • 이런 경험이 있기 때문에 코드를 전향할 때'만족스러운 견적을 받지 못한다'거나'기술을 보여줄 수 없다'는 이유는 제출한 코드(응답자의 기능)에 문제가 있다는 것이다.
    그렇다면 어떤 코드를 써야 기술을 보여주고 견적을 받을 수 있을까?이 글에서는 Paiza에서 실제 출제된 문제를 예로 들어 평가/평가되지 않은 코드에 대해 설명한다.

    추정 독자


  • 전업에 관심이 있는 사람

  • 이직할 때 주의해야 할 일을 알고 싶은 사람.
  • 예제


    이 글에서 다음은 예제다.
  • 장어집
  • 이 문제를 예제로 선택한 이유는요.

  • 프로펠러 특유의 알고리즘(동적 계획법 등)을 몰라도 대답할 수 있다

  • 그렇긴 한데, Paiza 주최연수입 보증 스카우트의 참가 조건(B등급 이상)을 충족하는 난이도입니다.

  • 코드 공개 허용
  • 일의 세 시.다음은 답변의 예를 소개하고, 우선 각자 상술한 문제를 해결해 주십시오.30~40분 정도면 대답할 수 있을 것 같아요.
    Paiza의 질문과 답변은 기본적으로 공개가 허용되지 않기 때문에 다른 질문에 대한 답변을 공개할 때 공개 여부를 확인해야 한다

    응답 예


    다음 3개 모두 B등급(Paiza가 준비한 테스트 코드를 모두 통과)을 받을 수 있는 코드다.그렇다면 채용 측이라면 어떤 대답을 쓴 엔지니어에게 탐정을 보내고 싶으세요?
    대답 예1
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            try (Scanner scanner = new Scanner(System.in)) {
                final int n = scanner.nextInt();
                final int m = scanner.nextInt();
    
                boolean[] seats = new boolean[n];
                for (int i = 0; i < m; i++) {
                    final int a = scanner.nextInt();
                    final int b = scanner.nextInt();
                    boolean canSit = true;
                    for (int j = 0; j < a; j++) {
                        final int p = (b + j) % n;
                        if (seats[p]) {
                            canSit = false;
                            break;
                        }
                    }
                    if (canSit) {
                        for (int j = 0; j < a; j++) {
                            final int p = (b + j) % n;
                            seats[p] = true;
                        }
                    }
                }
                int ans = 0;
                for (boolean seat : seats) {
                    if (seat) {
                        ans += 1;
                    }
                }
                System.out.println(ans);
            }
        }
    }
    
    응답 예 2
    import java.util.Scanner;
    import java.util.stream.IntStream;
    
    public class Main {
        public static void main(String[] args) {
            try (Scanner scanner = new Scanner(System.in)) {
                final int n = scanner.nextInt();
                final int m = scanner.nextInt();
                final int[] a = new int[m];
                final int[] b = new int[m];
                for (int i = 0; i < m; i++) {
                    a[i] = scanner.nextInt();
                    b[i] = scanner.nextInt();
                }
                System.out.println(solve(n, m, a, b));
            }
        }
    
        public static int solve(int n, int m, int[] a, int[] b) {
            boolean[] seats = new boolean[n];
            for (int i = 0; i < m; i++) {
                final int numbers = a[i];
                final int from = b[i];
                final boolean canSit = IntStream.range(0, numbers).noneMatch(p -> seats[(from + p) % n]);
                if (canSit) {
                    for (int j = 0; j < numbers; j++) {
                        seats[(from + j) % n] = true;
                    }
                }
            }
            return (int) IntStream.range(0, seats.length)
                    .mapToObj(i -> seats[i])
                    .filter(seat -> seat)
                    .count();
        }
    }
    
    응답 예 3
    import java.math.BigInteger;
    import java.util.List;
    import java.util.Scanner;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class Main {
        public static void main(String[] args) {
            try (Scanner scanner = new Scanner(System.in)) {
                final int n = scanner.nextInt();
                final int m = scanner.nextInt();
                final List<Group> groups = Stream.generate(() ->
                        new Group(scanner.nextInt(), scanner.nextInt())
                ).limit(m).collect(Collectors.toList());
                System.out.println(solve(n, groups));
            }
        }
    
        public static int solve(int n, List<Group> groups) {
            Seats seats = new Seats();
            for (Group group : groups) {
                Seats copy = seats.clone();
                for (int i = 0; i < group.numbers; i++) {
                    final int p = (group.from + i) % n;
                    if (seats.isOccupied(p)) {
                        seats = copy;
                        break;
                    } else {
                        seats.occupy(p);
                    }
                }
            }
            return seats.count();
        }
    
        private static class Group {
            public final int numbers;
            public final int from;
    
            public Group(int numbers, int from) {
                this.numbers = numbers;
                this.from = from;
            }
        }
    
        private static class Seats implements Cloneable {
            private BigInteger value = BigInteger.ZERO;
    
            public void occupy(int pos) {
                value = value.or(BigInteger.ONE.shiftLeft(pos));
            }
    
            public boolean isOccupied(int pos) {
                return value.and(BigInteger.ONE.shiftLeft(pos)).testBit(pos);
            }
    
            public int count() {
                return value.bitCount();
            }
    
            @Override
            public Seats clone() {
                try {
                    return (Seats) super.clone();
                } catch (CloneNotSupportedException e) {
                    throw new AssertionError();
                }
            }
        }
    }
    

    총평가


  • 대답 예1 함수 디자인 기술과 Java 언어 기능이 낮은 인상을 준다
  • Main#main에서 모든 처리를 실시했기 때문에 함수의 작업 분할을 할 수 없습니다(표준 입력의 읽기 처리와 내보내기 처리의 분할), 단일 테스트는 쓰기 어렵습니다
  • Java 8에서 가져온 Stream API를 사용할 수 있지만 사용하지 않은 경우

  • 그 결과 응답자들은 함수 설계 기술이 낮은 사람, 단일 테스트 경험이 적은 사람, 자바 기술이 낮은 사람, 혹은 최근 자바의 언어 기능을 모르는 사람(열심히 공부하지 않는 사람)이 인상적이었다.

  • 이렇게 되면 당연히 희망적인 오퍼를 받을 수 없다
  • 독자들 중에'문제가 있는 코드를 의도적으로 쓴 거 아니야?'어떤 사람들은 이렇게 생각할 수 있지만, 본 문제의 대답례를 검색할 때, 유사한 코드를 발견할 수 있다.

  • 한편, 응답례 2는 응답례 1에서 지적한 버전을 수정하여 응답례 1에서 부정적인 인상을 줄 위험을 줄였다

  • 하지만 데이터 구조 디자인과 관련된 기능이 조금 낮다는 인상을 받았다.
  • Main#solve에 전달된 매개 변수ab는 쌍으로 사용되기 때문에 독립형을 준비하여 총결산하고 싶다

  • 응답례 3 대상을 대상으로 하는 방식을 채택하여 이전에 보여준 두 가지 예와 완전히 다르다
  • 실현된 세부 사항을 숨기기 때문에 주 논리Main#solve의 가독성이 다른 대답 예시
  • 보다 높다.

    총결산


    응답례 1-3에서 보듯이 프로콘과 같은 디자인, 실시 기능을 구분하기 어려운 문제라도 응답자의 기능에 따라 기술을 보여줄 수 있다.만약 행 코드를 통해 예상한 결과를 얻지 못했다면

  • 자신의 디자인/실장 기술을 다시 연마하다

  • 좋은 성적을 거두는 것보다 예쁜 코드를 써야 한다는 것을 깨달았다
  • 각별히 노력해 주시기 바랍니다.좋은 성적을 내지 못하면 신청할 수 없는 기업도 있기 때문에 성적에 신경 쓰는 마음도 이해하지만, 좋은 성적을 내도 잘 대답하지 못하면 희망적인 오퍼가 나오지 않는다.
    이 기사는 코드를 바꾸고 싶은데 아무리 해도 좋은 견적을 얻지 못하거나 무엇을 주의해야 할지 모르는 사람들의 참고가 될 수 있다면 좋겠습니다.

    좋은 웹페이지 즐겨찾기