티스토리 뷰
- 오전
- 집안 정리, 장보기
- 오후
- 코딩테스트
- 포트폴리오 정리
- 저녁
- 그림
코딩테스트 - 대소문자 바꿔서 출력하기
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/181949
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
영어 알파벳으로 이루어진 문자열 str이 주어집니다. 각 알파벳을 대문자는 소문자로 소문자는 대문자로 변환해서 출력하는 코드를 작성해 보세요.
입력 #1 | 출력 #1 |
aBcDeFg | AbCdEfG |
내가 쓴 코드
public class Example
{
public static void Main()
{
String s;
Solution solution = new Solution();
Console.Clear();
s = Console.ReadLine();
Console.WriteLine(solution.SwapCase(s));
}
}
public class Solution
{
public string SwapCase(string str)
{
char[] result = new char[str.Length];
for (int i = 0; i < str.Length; i++)
{
if (char.IsUpper(str[i])) { result[i] = char.ToLower(str[i]); }
else if (char.IsLower(str[i])) { result[i] = char.ToUpper(str[i]); }
else { result[i] = str[i]; }
}
return new string(result);
}
}
이번문제는 Main문에 바로 작성하는 것이었다.
클래스를 만들어서 쓰는 방법이 더 익숙기도 하고 클래스를 쓰는 걸 연습해둬야할 것 같아서 Main에 직접 작성하지 않았다
char[] result = new char[str.Length];
1. 우선 배열의 크기를 정해준다.
받은 str의 길이만큼 result의 크기를 정해준다.
for (int i = 0; i < str.Length; i++)
{
if (char.IsUpper(str[i])) { result[i] = char.ToLower(str[i]); }
else if (char.IsLower(str[i])) { result[i] = char.ToUpper(str[i]); }
else { result[i] = str[i]; }
}
2. str.Lenght str의 길이만큼 포문을 돌려준다
3. char.IsUpper(str[i]) 대문자면 result에 소문자로 i순서에 넣는다.
4. char.IsLower(str[i]) 소문자면 result에 대문자로 i순서에 넣는다.
5. 숫자나 다른문자일 경우 그대로 i순서에 넣는다.
return new string(result);
string을 return 한다.
받은 str는 자료형이 string 이었으나 result는 배열이니 배열을 "new string()"함수로 string으로 바꾸는 것.
다른 사람의 코드
public static void Main()
{
String s;
Console.Clear();
s = Console.ReadLine();
foreach ( char c in s)
{
if(char.IsUpper(c))
{
Console.Write(char.ToLower(c));
}
else
{
Console.Write(char.ToUpper(c));
}
}
}
굳이 char배열을 만들 필요가 없구나 깨달았다.
foreach ( char c in s)
1. foreach를 통해 s안의 char c들을 돌린다.
if(char.IsUpper(c))
{
Console.Write(char.ToLower(c));
}
else
{
Console.Write(char.ToUpper(c));
}
2. c가 대문자라면 소문자로, 그게 아니라면 대문자로 바꾸고 바로 console로 띄운다.
정말 간단하다
다른 사람의 코드2
public static void Main()
{
String s;
Console.Clear();
s = Console.ReadLine();
string res = "";
for(int i=0; i < s.Length;i++){
char c = s[i];
if(c >= 65 && c <=90)
res += (char)(c + 32);
else
res += (char)(c - 32);
}
Console.Write(res);
}
이건 좀 재미있어보여서 가져왔다.
매일 함수만 쓰다보니 아스키코드를 활용하는 방법을 놓치게 되는 것 같다.
다음은 아스키코드다
컴퓨터가 문자를 숫자로 표현하는 방식을 말한다.
'A' ~ 'Z' 는 65 ~ 90을 의미한다.
'a' ~ 'z'는 97 ~ 122을 의미한다.
97('a')과 65('A')의 차이는 32.
char 'A'에서 +32를 한다면 소문자가 되는 것이고
char 'a'에서 -32를 한다면 대문자가 된다.
if(c >= 65 && c <=90)
res += (char)(c + 32);
else
res += (char)(c - 32);
이 말은 즉 대문자라면 소문자로 바꾸고, 대문자라면 소문자로 바꾼다는 뜻
Project_Zomvid-19 에러고치기
NavMesh에러
이 문제를 알고보니 토끼나 좀비에 문제는 없었다.
문제는 새로 배치된 좀비나 토끼는 새로 NavMesh를 구워줘야 잘 작동하는 것.
bake를 안하고 토끼를 새로 배치하면 NavMesh가 떴다
하지만 토끼를 미리 하나 배치하고 bake를 한 후 돌려보니 토끼에 관한 NavMesh에러는 뜨지않았다!
일반좀비1 토끼1 너스좀비1 이렇게 배치한 후 Bake를 눌러줬다.
처음에 뜨던 모든 NavMesh에러가 뜨지 않게되었다!
하지만 플레이어가 원래 있었던 자리에서 멀어지면
다시 NavMesh가 떴다.
토끼 관련 코드가 아닌 모두 좀비관련 NavMesh에러..
스폰존에 좀비가 스폰 하면서 제대로 땅을 안밟은게 아닐까? 생각했다
좀비 스폰존8번을 집중적으로 보겠다.
결과
좀비들은 땅을 잘 밟은 것 처럼 보인다!
하지만 어째선지 bake가 엉뚱한 곳으로 옮겨진 것 같다.
원인을 보니 nmsObject.script 문제였다.
using System.Collections;
using System.Collections.Generic;
using Unity.AI.Navigation;
using UnityEngine;
public class nmsObject : MonoBehaviour
{
private NavMeshSurface nms;
private void Awake()
{
nms = GetComponent<NavMeshSurface>();
}
private void Start()
{
nms.BuildNavMesh();
Debug.Log("nmsObject Star()");
}
private void Update()
{
if (IsFarFromPlayer())
{
//nms.BuildNavMesh();
}
}
private bool IsFarFromPlayer()
{
if(Vector3.Distance(transform.position, CharacterManager.Instance.player.transform.position) > 150)
{
transform.position = CharacterManager.Instance.player.transform.position;
return true;
}
return false;
}
}
update문에서 내용을 주석처리해서 괜찮은 것 처럼 보이지만
if문에서는 IsFarFromPlayer()함수가 작동하며 프레임마다 플레이어가 멀리갔는지 검사하고 있다.
IsFarFromPlayer함수는
Vector3.Distance(transform.position, CharacterManager.Instance.player.transform.position) > 150
: BakeArea(NavMeshSurface 오브젝트)가 플레이어로부터 150 이상 멀어졌을 때
transform.position = CharacterManager.Instance.player.transform.position;
: BakeArea의 위치를 강제로 플레이어 위치로 변경한다.
문제를 찾았고 이제 더이상 navMesh 에러가 뜨지않는다!