Today Mini Learned :

기록하는 습관 들이기

ACTIVITY/모각코 (2018)

1-1 codewars

얌챠 2019. 1. 3. 20:37

Find The Parity Outlier

주어지는 배열(크기는 3이상)에서 한개만 있는 홀수 또는 짝수를 찾는 문제


배열에서 처음 두개의 원소를 각각 2로 나눈 후 나머지를 a와 b에 저장한다.

a와 b를 비교하여 같을 경우 - 이후의 정수에서 나머지가 다른 하나를 찾으면 된다.

for문을 돌려 배열의 원소들을 그 다음부터 확인해 나간다.

다를 경우 - 처음 두개의 정수 중 답이 있다.

그 다음 원소의 나머지를 확인한다. a와 b중 그 나머지와 같지 않은 것을 찾으면 답을 찾을 수 있다.


제출한 코드


public class FindOutlier{

  static int find(int[] integers){

  

  int a = integers[0]%2;

  int b = integers[1]%2;

  

  if(a==b){

    for(int i=2;i<integers.length;i++){

      int c = integers[i]%2;

      if(c!=a){

        return integers[i];

      }

    }

  }

  else{

    int c = integers[2]%2;

    if(a==c){

      return integers[1];

    }

    else{

      return integers[0];

    }

  }

  return 0;

}}


 =>예시 문제는 통과했으나 attempt실패...!! 맞는것같은데 attempt로 제출하면 틀림ㅜ 왜그런지 모르겠음



190111--------------------------

지금까지 attempt가 틀린 이유를 생각해보면 그냥 문제에서 놓쳤거나 잘못 생각한 부분이 있다는 뜻이었다.

이 문제도 그냥 다 지우고 다시 생각해 보았다.


그래도 문제가 풀리지 않아 출력문을 이용해 어떤 부분이 값이 다른지 살펴봤다.

찾아보니 문제 푸는 방법에는 오류가 없었는데 integers[x]%2를 사용할 때 한 가지 간과한 부분이 있었다.

음수일 때 홀수와 양수일 때 홀수가 -1, 1로 다르기 때문이다. 이 부분을 고쳐 주면 문제가 풀릴 것 같다.


절댓값을 씌우는 방법은 Math.abs()를 사용하는 방법이 있어 그 방법을 사용하여 문제를 풀었더니 해결되었다.


public class FindOutlier{

  static int find(int[] integers){

    if(Math.abs(integers[0]%2) == Math.abs(integers[1]%2)){

      for(int i=2 ; i<integers.length ; i++){

        if(Math.abs(integers[i]%2)!=Math.abs(integers[0]%2)){

          return integers[i];

        }

      }

    }

    else{

      if(Math.abs(integers[2]%2) == Math.abs(integers[0]%2)){

        return integers[1];

      }

      else{return integers[0];}

    }

    return 0;

  }

}


=>해결




Find the missing letter

배열이 주어지고 안에 연속된 알파벳이 들어 있음
이 중에서 빠진 것을 찾는 문제


알파벳마다 아스키 코드가 존재하므로 그것을 이용

알파벳 앞에 (int)를 붙이면 10진수 아스키 코드로 변환가능함

그렇게 for문을 돌려 순서대로 찾다가 다음 순서가 아닌 글자가 나온다 = 원래 나와야 할 글자를 출력

숫자 또한 다시 알파벳으로 변경 가능 (char)숫자 를 사용하면 됨


제출한 코드


public class Kata

{

  public static char findMissingLetter(char[] array)

  {

    int nextNum = ((int)array[0]) + 1;

    

    for(int i=1;i<array.length;i++){

      if(nextNum!=(int)array[i]){

        return (char)nextNum;

      }

      else{

        ++nextNum;

      }

    }

    return ' ';

  }

}


=>통과




Exes and Ohs

스트링이 주어지고, x와 o의 숫자가 같을 경우 true를 반환하는 문제


스트링.charAt(i)를 사용하면 i번째에 있는 원소를 가져올 수 있음

이를 통해 for문으로 스트링의 한 글자씩을 탐색함


boolean자료형의 result변수에 결과로 출력할 값을 저장.

초기화 상태는 true임. 아무것도 없을 경우도 x와 o의 숫자가 같다고 보니까.


190111------------------------

가장 간단한 방법은 그냥 x와 o의 개수를 세고 이 둘이 같지 않으면 false를 출력하는 방법이다. 딱히 다른 방법이 떠오르지 않아 이 방법으로 일단 풀고 다른 해답을 보기로 했다.


char문자를 비교할 때는 str.charAt(i) == 'o'와 같이 해야 한다는 것을 알았다.


public class XO {

  

  public static boolean getXO (String str) {

    int ONUM = 0;

    int XNUM = 0;

    

    for(int i=0;i<str.length();i++){

      if(str.charAt(i)=='o' || str.charAt(i)=='O'){ONUM++;}

      else if(str.charAt(i)=='x' || str.charAt(i)=='X'){XNUM++;}

    }

    

    if(ONUM==XNUM){return true;}

    return false;

  }

}


=>통과


다른 해답을 찾아봤는데 str 을 전부 그냥 소문자로 바꿔버린 후,

o만을 replace함수로 없앤 길이와 x만을 없앤 길이가 같을 때 true를 리턴하는 방법이 있었다.

없앤 길이를 비교하는 것은 생각하지 못했던 방법이다. 그냥 x와 o를 셀 생각만 했었는데 이런 방법도 있구나 싶다. 

'ACTIVITY > 모각코 (2018)' 카테고리의 다른 글

2-1 codewars  (0) 2019.01.08
2-오늘의 목표 (190108)  (0) 2019.01.08
1-결과  (0) 2019.01.03
1-2 leetcode  (0) 2019.01.03
1-오늘의 목표 (190103)  (0) 2019.01.03